Skip to content

Repository files navigation

رَتِّل

افتح التطبيق · نسخة GitHub Pages

رَتِّل تطبيق عربي هادئ لحفظ القرآن، صُمّم للهاتف أولًا. يُلقّنك المقطع كما يفعل شيخ الكُتّاب: يُسمعك الجزء منفردًا حتى يثبت، ثم يصله بما قبله، ثم يسرد المقطع كاملًا، ثم يجدوله للمراجعة. لا حساب ولا خادم؛ كل شيء يبقى على جهازك.

طريقة التلقين

الحفظ تكرار، لكن التكرار الخطي (أن تُعيد الآية عشرين مرة ثم تنتقل) يبني آياتٍ منفصلة لا سورةً متصلة. الصعوبة الحقيقية عند الحافظ ليست في الآية، بل في موضع الوصل بين آية وأخرى وبين صفحة وأخرى.

فالجلسة هنا تسير على ثلاث خطوات متكرّرة:

  1. تلقين: يُعاد المقطع الجديد منفردًا حتى يستقرّ.
  2. وصل: يُضَمّ المقطع الجديد إلى ما قبله ويُعادان معًا، فيُتمرَّن على موضع الالتحام نفسه لا على طرفيه فقط.
  3. سرد: يُقرأ المقطع كاملًا في النهاية لتثبيته.

هذه صياغة لطريقة التكرار الدائري المتقاطع التي طرحها أحمد شمس في مجتمع إتقان، وهي في جوهرها الطريقة التي وصفها الشيخ عبد المحسن القاسم في الطريقة الأسهل لحفظ القرآن الكريم: آية ×٢٠، ثم التي تليها ×٢٠، ثم الاثنتان معًا ×١٠، وهكذا. الوصل عنده بالمقطع أو المقطعين السابقين، لا بالمقطع من أوله في كل مرة، ولهذا كان هذا هو الأصل في التطبيق.

مقدار المقطع

المقطع هو الوحدة التي تُلقَّن وتُوصَل بما قبلها، وأنت تختار قدرها من الصفحة الأولى:

  • آية: الآية كاملة وحدة واحدة.
  • جملة: تُقسَّم الآية الطويلة عند علامات الوقف التي يقف عندها القارئ فعلًا (ۚ جائز، ۗ قلى، ۘ لازم)، ويُقصّ الصوت عند الموضع نفسه، فتصير آية الكرسي ست جمل تُلقَّن واحدةً واحدة ثم تُوصَل. ولا يقع القطع عند ۖ (صلى) لأن الوصل عندها أولى والقارئ يمضي فيها فعلًا، ولا عند ۙ (لا) ولا ۛ (المعانقة) ولا ۜ (السكتة). والآية التي لا موضع وقف فيها تبقى كاملة، إذ ليس في النص ولا في التزمين ما يدلّ على موضع نفس القارئ داخلها.
  • آيتان أو ثلاث أو خمس: عدة آيات وحدة واحدة، لمقطع تعرفه وتريد وصل بعضه ببعض.

والفرق بين «جملة» و«آية» لا يظهر إلا في الآيات الطوال: ٤٦٧٦ آية من ٦٢٣٦ ليس فيها موضع قطع أصلًا، فهي واحدة في الحالتين، ومنها الإخلاص وأوائل البقرة. أما آية الكرسي وحدها فتنتقل من وحدة واحدة في نحو ٩ دقائق إلى ست وحدات في نحو ٢٧ دقيقة.

فاختر «جملة» للآية الطويلة التي تتعثّر في وسطها، فهي تُمرّنك على مواضع الوصل داخل الآية نفسها لا على طرفيها فقط، واختر «آية» فيما سوى ذلك أو متى زادت الجلسة على ما تحتمل.

المزايا

  • جلسة تلقين كاملة: اختر السورة ومن أي آية إلى أي آية، فيبني التطبيق خطوات الجلسة ويمشي فيها بنفسه، مع تنقّل بين الخطوات وإعادة أي خطوة.
  • تقدير الجلسة قبل بدئها: يظهر الزمن المتوقّع وعدد المرات قبل الضغط على «ابدأ»، ويتحدّث العدّاد أثناء الجلسة. فإن طالت الجلسة، خفّف التكرار أو ضيّق المدى.
  • مرات التكرار ظاهرة في الصفحة الأولى: تلقين المقطع منفردًا، ووصله بما قبله، والسرد الأخير، ثلاثة أعداد مكتوبة فوق التقدير نفسه، لا خلف زرٍّ يُفتح، فترى أثرها في الزمن وأنت تضبطها.
  • القارئ في الصفحة الأولى: مع صفّ التقدير، لأن سرعة القارئ هي أكثر ما يُطيل الجلسة أو يُقصّرها: أبطأ مصحف هنا يستغرق في المقطع نفسه نحو ثلاثة أضعاف ما يستغرقه أسرعه.
  • اختيار الآية بأوّلها: في اختيار المقطع تُعرض آيات السورة بأوائلها، فمن يعرف الآية ولا يعرف رقمها بحث بكلماتها، ومن يعرف الرقم كتبه.
  • سكتة الترديد بقدر المقطع: مدة السكوت تُقاس بطول المقطع نفسه لا برقم ثابت، فتطول مع الآية الطويلة. اخترها نصف المقطع أو بقدره أو مرة ونصف أو ضعفه، أو اجعلها يدوية تنتقل بضغطة.
  • أو استماع فقط: من أراد أن يكرّر السماع دون ترديد اختار «أستمع فقط» في الصفحة الأولى، فتمشي الجلسة بخطواتها بلا سكتات.
  • مقدار المقطع بيدك: جملة، أو آية، أو كتلة من آيتين أو ثلاث أو خمس، من صفٍّ بهذا الاسم في الشاشة الأولى، على ما فُصّل أعلاه. وفي التقسيم بالجملة يُقصّ النص والصوت معًا عند مواضع الوقف.
  • خطة مراجعة: بعد كل جلسة تُقيّم سردك، فيُجدوَل المقطع. لا يمرّ على أي مقطع أكثر من ٣٥ يومًا دون أن يعود، والمقطع الأوسع يحلّ محلّ ما ابتلعه من مقاطع أضيق.
  • مراجعة حرة: الشاشة الأخرى تعرض من آية إلى خمس، تُخفيها لتقرأ من حفظك، وتُسجّل صوتك لتسمع نفسك. والتلاوة تمضي معك إلى الآية التالية بلا حاجة إلى زر التشغيل في كل مرة، ولمن أراد إيقاف ذلك خيارٌ في الإعدادات.
  • تسجيل خاص: بموجة صوتية مباشرة. لا يُرفع ولا يُحفظ في localStorage، ويُحذف عند تغيير الآية أو مغادرة الصفحة.
  • مظهر داكن أو فاتح أو تلقائي، وأربعة ألوان، وواجهة RTL بأزرار مناسبة للمس ومؤشرات تركيز واضحة.
  • تغيير القارئ في وسط الجلسة لا يُضيّع موضعك: الخطوات هي الخطوات نفسها بصوت آخر، فيمضي المؤشّر معها. وهذا في التقسيم بالآية وما فوقها دائمًا، وفي التقسيم بالجملة في الأغلب، إذ يختلف تقسيم قارئٍ عن قارئ في الآيات التي لا تزمين لها عنده، فتكون الجلسة جلسةً أخرى فتبدأ من أوّلها. وكذلك عدد مقاطع الوصل، فهو يبني جلسةً أخرى دائمًا، ويُنبّه الإعدادُ إلى ذلك حينها.

النص والصوت والتزمين

النص من Tanzil Uthmani 1.1، محفوظ في المستودع حرفيًا ومقسّم إلى ملف لكل سورة يُحمَّل عند الحاجة. راجع توثيق المصدر.

يضع المصدر البسملة في أول آية من كل سورة عدا الفاتحة والتوبة. وهي تُعرض سطرًا مستقلًا بلا رقم، وتُستثنى من الحفظ ومن الصوت، لأن القارئ يسجّلها منفصلة.

الصوت من everyayah.com، ملف لكل آية، باثني عشر قارئًا مرتّبين من أبطأ أداءً إلى أسرعه:

القارئ الأداء ثانية لكل حرف
محمد صديق المنشاوي (المجوّد) متأنٍّ جدًّا ٠٫٦٦
عبد الباسط عبد الصمد (المجوّد) متأنٍّ جدًّا ٠٫٦٥
محمود خليل الحصري (المعلّم) متأنٍّ ٠٫٥٣
محمود خليل الحصري متأنٍّ ٠٫٤٧
أيمن سويد متأنٍّ ٠٫٤٦
عبد الباسط عبد الصمد معتدل ٠٫٣٤
مشاري راشد العفاسي معتدل ٠٫٣٣
محمد صديق المنشاوي معتدل ٠٫٣٢
أبو بكر الشاطري سريع ٠٫٢٩
ياسر الدوسري سريع ٠٫٢٨
عبد الرحمن السديس سريع ٠٫٢٣
سعود الشريم سريع ٠٫٢٠

«ثانية لكل حرف» قياس فعلي على المصحف كاملًا لكل قارئ، وهو ما يُقدَّر به زمن الجلسة قبل تحميل أي ملف صوتي. ثم يُصحَّح التقدير من الأطوال الحقيقية كلما وصلت.

وتلاوة الشيخ أيمن سويد من تلاوات المتقنين في ضبط التجويد، إلا أنه لم يُنشَر لها تزمين للكلمات في أي مصدر، فالتكرار معها بالآية، ولا يُعرض معها خيار «جملة». وقياس أدائها مأخوذ من أطوال تسجيلاتها نفسها، معايَرًا على قارئ يُعرف قياسه من التزمين.

عنوان احتياطي: لكل تلاوة عنوان ثانٍ على المرآة التي يخدم منها موقع Quran.com صوته. فإن لم يستجب العنوان الأول انتقل الطلب إلى الثاني بلا انقطاع يسمعه المستمع، ثم يُعاد الاثنان مرة أخرى قبل أن يُقال إن التلاوة تعذّرت. والمرآة لا تحمل تسجيلات السديس والشريم والمنشاوي المجوّد بالجودة نفسها، فيُرجَع فيها إلى جودة أعلى من التلاوة ذاتها، وفرق الطول بين النسختين دون عُشر الثانية، فتبقى مواضع الوقف في محلّها.

تزمين الجمل لا يُطلب من واجهة خارجية أثناء الاستعمال. يجلبه scripts/prepare-timings.ts مرة واحدة من تزمين الكلمات في Quran.com، ويحوّله إلى مواضع القطع داخل كل آية، ويكتبه في src/data/timings/<القارئ>.json، ملفًّا لكل قارئ نحو عشرة كيلوبايت، لا يُحمَّل إلا عند اختيار التقسيم بالجملة. فالجلسة تعمل من ملفات المستودع وحدها.

تنتهي كل جملة عند بداية الكلمة التالية لا عند نهاية كلمتها، فلا تُقتطع آخر كلمة ولا تضيع سكتة القارئ بين الجملتين. وحيث اختلف تقطيع الكلمات بين المصدرين تبقى الآية كاملة بلا تقسيم بدل أن تُقصّ على غير هدى، وكذلك إذا كان القارئ يعيد المقطع في تسجيله فتقع نهاية الجملة داخل ما أعاده.

على أن تزمين الكلمات لا يحمل مواضع السكتات: القياس يُظهر أن ٩٢٪ من الكلمات المتتالية مُسجَّلة متلاصقة، فسكتة القارئ داخلة في مدّة كلمة لا واقعة بين كلمتين، فلا يُعثر عليها في هذه البيانات بأي حال. فتُؤخَّر مواضع القطع كلّها ٣٠٠ ملّي ثانية، ويبدأ التشغيل عند أول صوت في المقطع لا عند السكتة التي قُطع داخلها.

ثم تُقاس مواضع القطع على التسجيل نفسه، وهذا هو الجواب عن ذلك الرقم الثابت. يجلب scripts/verify-cuts.ts ملف كل آية تُقسَّم مرة واحدة، ويسأل ffmpeg عن مواضع السكوت فيه، فإمّا يُبقي القطع في موضعه لأنه واقع في سكتة حقيقية، وإمّا ينقله إلى أقرب سكتة، وإمّا يحذفه لأنه لا سكتة عنده أصلًا، أي أن النص قال إن القارئ يقف والتسجيل يقول إنه لا يقف.

وقد قِيست أربع تلاوات حتى الآن، فتبيّن ما لا يستطيع رقمٌ ثابت أن يفعله: جهة الخطأ نفسها تختلف من مصحف إلى مصحف. فمواضع القطع عند الحصري متقدّمة بوسيط ٤٠٩ ملّي ثانية، وعند عبد الباسط (المجوّد) متأخّرة بوسيط ٤٣٥، في نحو ألفَي موضع لكلٍّ منهما، ولا يكاد يشذّ منها شيء. فالرقم الثابت يُصلح الأول ويُفسد الثاني بالقدر نفسه، ولا يُمكن رقمٌ واحد أن يصيبهما جميعًا. وأقربها إلى الرقم الثابت مرتّل عبد الباسط بوسيط ٣٥٤، وهو الذي جعل الثابت يبدو صالحًا.

وأمّا مصحف الحصري المعلّم فكان صوابًا قبل القياس: ٩٦٪ من مواضع قطعه واقعة في سكتة حقيقية أصلًا، في مقابل ١٧٪ في مرتّل القارئ نفسه. وهذا شأن المصحف التعليمي: يُقرأ متمهّلًا مع وقفةٍ مقصودة عند كل موضع وقف، فتطول السكتات حتى يقع فيها حدُّ المُحاذي وإن لم يكن يسجّل السكتات. وفيه شاهدٌ عملي لما طُلب في المجتمع من أن يُبنى هذا التكرار على مصاحف المتقنين والمصاحف التعليمية.

على أنّ هذا القياس لا يصلح لكل مصحف. فبقياس غلاف الصوت على أربع وعشرين آية من كلٍّ من المصاحف الأحد عشر التي لها تزمين انقسمت قسمين لا شيء بينهما: المصاحف الستّة المرتّلة والمجوّدة القديمة بين مستوى الكلام فيها وأخفض ما فيها ٣٢ إلى ٦٦ دِسيبل، والخمسة الحديثة عشرة إلى ستّة عشر دِسيبل فقط، وأرضيّةُ ضجيج كلٍّ منها أعلى من حدّ الكشف نفسه، فلا تكاد تنزل تحته: أقلّ من أربعة في المئة من طول الملف، وأكثر ذلك في مطلعه. وهي تسجيلات مضغوطة المدى وفيها رجعٌ، فلا حدَّ ثابتًا يفرّق فيها بين سكتةٍ ومدٍّ.

ولمّا كانت الآية تفقد مواضع قطعها كلَّها إذا سقط منها موضعٌ واحد، فإنّ قياس تلك الخمس على غفلةٍ لا يُنقص ملفّاتها بل يُفرغها، ويسحب «جملة» من خمسة قرّاء في صمت. فصار البرنامج يقيس مدى التسجيل قبل أن يقيس فيه شيئًا، فيمتنع ويطبع الرقمين، ليكون امتناعه متحقَّقًا منه لا مسلَّمًا به.

وكانت النافذةُ التي يُبحث فيها عن أقرب سكتة ١٥٠٠ ملّي ثانية حين قِيست هذه الأربع أوّل مرة، فسقطت منها ٤٦٣ آية لا سكتة لها في تلك النافذة. ثم وُسِّعت إلى ٢٥٠٠، فرجعت ١٢٧ آية ومعها ١٩٢ موضع قطع. والتوسيع لا يُفسد شيئًا سبق قياسه، وذلك ببرهانٍ لا برجاءٍ: فالنافذة تحكم في قبول التصحيح لا في موضعه، وأمّا السكتة التي ينتمي إليها القطع وموضعه داخلها فمقروءان من التسجيل نفسه. فإعادة القياس بنافذة أوسع لا تُنقص شيئًا وإنما تزيد. وقد تحقّق ذلك في الملفات: لم تسقط ولم تتغيّرْ واحدةٌ من ٥٥٨٢ آية كانت فيها.

وثمّة مصحفٌ يصحّ عليه القياس ثم لا يُكتب له تزمين. فمرتّل المنشاوي يجتاز اختبار المدى، ثم لا يثبت له على المصحف كلّه إلا ٦٢٫٦٪ من آياته، وهو دون الحدّ الذي يكتب عنده البرنامج، فامتنع. وظاهر ذلك أنه قارئ يصل ما حقُّه الوقف، وليس كذلك. فبقياس ثلاث مئة آية، ومعها شاهدٌ من مواضع وسط الجملة لا يمكن أن يكون فيها وقف: يثبت له ٦٧٪ عند الحدّ المستعمل اليوم، و٩٠٪ إذا أُرخي ثمانية دِسيبلات، ولا ترتفع نسبةُ ما يُحسب من مواضع الشاهد سكتةً إلا من ١٫٢٪ إلى ١٫٤٪. وهذه النسبة نفسها ٣٪ عند الحصري بالحدّ المستعمل اليوم. فحدٌّ يسمع المنشاوي كلَّه أقلُّ تسرّعًا من الحدّ الذي يعمل به الآن. وسكتاته حقيقية، وإنما لا تبلغ حدَّ الكشف: فمنتهاها فوقه بما بين ثمانية دِسيبلات واثني عشر، يملؤه الرجعُ وضجيجُ المكان لا السكوت. فالعيب في المقياس لا في القارئ، وعلاجه أن يُؤخذ الحدُّ من كل تسجيل على حِدة لا أن يكون رقمًا واحدًا للجميع. وهذا يفتح مصحفَي المنشاوي ولا يفتح الخمسة الحديثة، فأرضيّةُ ضجيجها فوق حيث ينبغي أن تكون سكتاتها.

وحقل verified في كل ملف تزمين يقول أيّ مصحف قِيس وأيّه ما زال على الرقم الثابت. وتفصيل ذلك كله بالأرقام في توثيق المصدر.

اختصارات لوحة المفاتيح

تعمل على macOS وWindows وLinux، وتظهر داخل الإعدادات على أجهزة سطح المكتب:

  • ← أو Enter: التالي، أي الخطوة التالية في الجلسة أو الآيات التالية في المراجعة الحرة. وفي أثناء سكتة الترديد يعني إنهاءها، أي «تابِع»، لا تخطّي الخطوة كلها.
  • →: السابق.
  • Space أو ↑: تشغيل وإيقاف. ويعمل الإيقاف في أثناء سكتة الترديد أيضًا، فالسكتة من الجلسة والوقت يمضي فيها. وأمّا إنهاء السكتة قبل تمامها فله زرٌّ إلى جانب زرّ التشغيل، وفي «أنا أتحكّم» يكون على زرّ التشغيل نفسه إذ لا شيء يُوقَف حينئذٍ.
  • ↓: إعادة الخطوة في الجلسة، أو تكرار التلاوة في المراجعة الحرة.
  • Shift + Enter: بدء تسجيلك أو إنهاؤه (المراجعة الحرة).
  • Shift + Space: تشغيل تسجيلك وإيقافه.

متى وقع التحديد على زر، بعد Tab أو نقرة، عاد Space وEnter إلى الزر نفسه، وهذا حقّ الزر في كل متصفح فلا يُنتزع منه. ولذلك لكل من المفتاحين سهمٌ يقابله لا ينازعه عليه عنصر. والأسهم مُعفاة من معيار WCAG 2.1.4 الذي يوجب لاختصارات الحروف المفردة أن تُعطَّل أو تُنقَل. وداخل إطار النص إذا زاد على ما يسعه، يعود السهمان إلى القراءة فيمرّران النص، ويبقى Page Up وPage Down وHome وEnd للتمرير في كل حال.

تتوقف الاختصارات أثناء الكتابة أو فتح لوحة، ولا تعترض اختصارات النظام التي تستخدم Ctrl أو Command أو Alt. كل وظيفة متاحة أيضًا عبر زر ظاهر.

التشغيل المحلي

npm install
npm run dev

للتحقق قبل الدفع:

npm test
npm run lint
VITE_BASE_PATH=/subpath/ npm run build

والمسار الفرعي هنا أيّ مسار، فالمقصود التحقّق من أن البناء يعمل إذا خُدم من مجلد فرعي لا من جذر نطاق. أمّا المسار الحقيقي فيستنبطه النشر من إعدادات Pages نفسها ولا يُكتب في المستودع، فتغيير اسم المستودع لا يحتاج تعديلًا هنا.

يُستخدم npm ci في بيئات البناء لتثبيت الإصدارات الموجودة في package-lock.json حرفيًا.

لإعادة توليد البيانات المحفوظة في المستودع، ولا داعي لذلك إلا عند تحديث مصدرها:

npm run prepare:quran     # من data/quran-uthmani.txt إلى src/data/surahs/
npm run prepare:timings   # مواضع الوقف الصوتية إلى src/data/timings/

بنية المشروع

src/
  data/        النص والصوت والتزمين والإعدادات المحفوظة
  memorize/    منطق الحفظ: التقسيم، والخطوات، والتشغيل، والمراجعة
  components/  الشاشات واللوحات

src/memorize كلّه مستقل عن React عدا ملفات use*.ts: تقسيم الجمل، وبناء الخطوات، ومشغّل الصوت، ومحرّك الجلسة، وجدولة المراجعة، كلها دوال وأصناف عادية مغطّاة باختبارات لا تحتاج متصفحًا.

البناء على هذا العمل

ما البنية التحتية التي يحتاجها من أراد نقل هذا المحرّك إلى تطبيقه؟ لا شيء: لا خادم، ولا قاعدة بيانات، ولا حساب مستخدم. تطبيق ثابت يعمل في المتصفح، وكل ما يُحفَظ يبقى في localStorage على جهاز صاحبه. وما يلزم من بيانات إمّا محفوظ في المستودع وإمّا مجلوب من مصدر عامّ:

البيانات المصدر الصيغة في المستودع
النص العثماني تنزيل ١٫١ بمرجع مثبَّت ببصمة SHA256 src/data/surahs/<١..١١٤>.json فيه { notice, verses[] }
الصوت https://everyayah.com/data/<المجلد>/SSSAAA.mp3، ملف لكل آية لا يُحفظ، ويُجلب عند التشغيل
عنوان الصوت الاحتياطي https://mirrors.quranicaudio.com/everyayah/<المجلد>/SSSAAA.mp3 كما سبق
تزمين الكلمات https://api.qurancdn.com/api/qdc/audio/reciters/<القارئ>/audio_files?chapter=<١..١١٤>&segments=true src/data/timings/<القارئ>.json فيه { reciter, recitation, source, generated, verified, bounds }، وbounds جدول من "سورة:آية" إلى مواضع القطع بالملّي ثانية، وverified تاريخُ قياس تلك المواضع على الصوت نفسه، وما لا يحمله فمواضعه على الرقم الثابت

ومصحف الحصري الذي يبدأ به التطبيق مثالٌ على السلسلة كاملة: صوته من المجلد Husary_64kbps على everyayah، وتزمين كلماته من التلاوة رقم 6 في Quran.com، ومواضع قطعه محسوبة منهما في src/data/timings/husary.json. وجميع القرّاء وأرقام تلاواتهم ومجلداتهم في ملف واحد: src/data/audio.ts.

وشرطان لا بدّ منهما لمن أراد أن يُبدّل مصدر الصوت: أن يُرسل المصدر ترويسة access-control-allow-origin، وإلا تعذّر على المتصفح فكّ ترميز الصوت وقصّه، وأن يكون معدّل التدفق ثابتًا حتى يوافق زمن الملف ما يقوله التزمين. وكثير من مصادر الصوت القرآني لا يُرسل هذه الترويسة، منها cdn.islamic.network.

وهذه ملفات المحرّك ووظيفة كل منها، وكلها مستقلة عن الواجهة كما في «بنية المشروع» أعلاه:

  • phrases.ts: من نصّ الآية إلى جملها، عند مواضع الوقف التي يقف عندها القارئ.
  • session.ts: من المقطع المختار إلى وحدات التكرار ومقاطع الصوت التي تقابلها، مع تقدير الزمن.
  • schedule.ts: التكرار الدائري المتقاطع، خطوةً خطوة.
  • player.ts: طبقة Web Audio: الجلب وفكّ الترميز والذاكرة المؤقتة وقصّ المقاطع وجدولتها.
  • runtime.ts: آلة حالات الجلسة، تُقاد في الاختبارات بساعة وصوت مصطنعين بلا متصفح.
  • review.ts: جدولة المراجعة، وهي SM-2 بسقف ٣٥ يومًا وعامل سهولة محدود من الطرفين.

وترخيص كل ذلك: ما كُتب هنا 0BSD بلا شرط ولا إسناد، وما يُعاد نشره فحسب فشروطه في NOTICE. فانقل ما شئت من هذا المحرّك بلا استئذان، وأبقِ إشعار تنزيل مع نص القرآن.

وتفصيل مصادر البيانات وحدودها وما لم يُحلّ منها في data/README.md، ومخطّطات العمل الداخلي في AGENTS.md، ودليل المبتدئ في docs/CONTRIBUTING.md.

الأداء

تُحمَّل السورة عند اختيارها وتُحفظ في ذاكرة الجلسة، ولا تُعيد تغييرات اللون أو المظهر تحميل النص. أما الصوت فيُفكّ ترميزه مرة واحدة ويُحتفظ به بحد أقصى نحو سبع دقائق من التلاوة، ويُشغَّل عبر Web Audio بجدولة مسبقة حتى تلتحم الآيات في خطوة الوصل بلا فاصل. وتُحمَّل بقية آيات المقطع في الخلفية أثناء الاستماع.

النشر

تطبيق Vite ثابت يُنشر تلقائيًا إلى GitHub Pages عند تحديث الفرع الرئيسي. لا يحتاج خادمًا ولا قاعدة بيانات. ويستنبط النشر مسار الموقع من إعدادات Pages، فلا يُكتب اسم المستودع في البناء.

وتُنشر نسخة ثانية على النطاق دار حفظ. مستودع edriso/darhifz يحتوي الملفات المبنية فقط، ويُستبدل بسجلّ من التزام واحد عند كل نشر؛ التعديلات على المصدر مكانها هنا في rattle. وهذه النسخة تُبنى بمسارات نسبية، فلا يعنيها اسم المستودع ولا مسار الموقع أصلًا.

لتفعيل النسخة الثانية، يُضبط متغيّر Actions باسم MIRROR_REPO على مستودع الوجهة، ويُحفظ مفتاح SSH خاص في السرّ MIRROR_DEPLOY_KEY، مع إضافة مفتاحه العام إلى مستودع الوجهة بصلاحية الكتابة. وفي إعدادات Pages للوجهة يُختار النشر من الفرع main والمجلّد /. ويُضبط مع MIRROR_REPO متغيّرٌ باسم MIRROR_URL على عنوان النسخة الثانية، فمنه تأخذ بطاقةُ مشاركتها عنوانها المطلق؛ وإن لم يُضبط رجعت البطاقة إلى عنوان GitHub Pages، وهو عنوان مطلق لصورة موجودة. وإذا لم يُضبط MIRROR_REPO يُتخطّى نشر النسخة الثانية.

يمكن إضافة النطاق الخاص لاحقًا من إعدادات Pages في darhifz: يحتفظ النشر بملف CNAME الموجود هناك، ومسارات الملفات النسبية تعمل على عنوان GitHub Pages والنطاق الخاص معًا، دون تعديل إعدادات البناء.

جزاهم الله خيرًا

الفكرة من طرح أحمد شمس في مجتمع إتقان، ومن النقاش الذي دار حوله: ملاحظات رقية بورية على إرهاق الوصل من أول المقطع، وعلا صالح على اقتطاع آخر الكلمات وثبات مدة السكتة، وعادل بن يحي على تبسيط الإعدادات، ومَيادة حلمي على تنويع سرعات القرّاء، وهي كلها معالَجة هنا. وتواتر للأخ علي ملص أول نموذج عملي للفكرة.

ومن جولة النقاش الثانية بعد التجربة: أن يكون عدد مرات التكرار في الصفحة الأولى مع بقية خيارات الجلسة، وأن يُختار موضع الآية من قائمة تعرض أوّلها لا بالرقم وحده، وأن تمضي التلاوة مع الآية في المراجعة الحرة، وأن يكون لصفّ «طول المدى» عنوانٌ ظاهر، وأن يكون القطع عند سكتة القارئ لا عند حدّ الكلمة في التزمين، وأن يُعتنى بمصاحف القرّاء المتقنين والمصاحف التعليمية. وكلها معالَجة في هذه النسخة، وما بقي من قيود المصادر مكتوب في data/README.md.

الترخيص

كل ما كُتب لهذا المستودع مرخّص برخصة 0BSD: خُذه واستعمله وانشره، بلا شرط ولا إسناد ولا ذِكر لنا. ولا تضع ترويسة ترخيص في ملف، ولا سطرًا ينسب العمل إلينا.

وما يُعيد المستودع نشره فحسب فأمره على خلاف ذلك، إذ ليست شروطه لنا حتى نتنازل عنها. نص القرآن من مشروع تنزيل برخصة Creative Commons Attribution 3.0: يُذكر تنزيل حيث استُعمل النص، ولا يجوز تغيير النص ولا إزالة إشعار المصدر، وهو مرافق لكل نسخة منه في المستودع. وتفصيل ذلك كله، مع التزمين والخطوط والصوت، في NOTICE.

About

رَتِّل، تطبيق هادئ لحفظ القرآن على الهاتف أولًا. يُلقّنك المقطع، ثم يصله بما قبله، ثم يسرده، ثم يجدوله للمراجعة. نص تنزيل المحقّق، اثنا عشر قارئًا، وتسجيل خاص. بلا حساب ولا خادم.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages