التأليف عبر المتصفح (Writespace)
يتناول هذا الدليل وحدة التأليف عبر المتصفح المدمجة في Papex (نقطة الدخول /writespace) — مكتب كتابة في المتصفح لا يتطلب تثبيت TeX محليًا ولا كتابة JSON يدويًا. تدفع تدفق "رفع حزمة المصدر" من دليل الإرسال مباشرة إلى المتصفح: تملأ البيانات الوصفية وتكتب المتن عبر الإنترنت، ويولّد النظام papex.json متوافقًا مع ملفات القسم .tex. يمكنك بعد ذلك تصدير tar.gz أو النشر إلى المنصة بنقرة واحدة.
1. نظرة عامة
1.1 ما المشكلات التي يحلها
| نقطة الألم في "رفع حزمة المصدر" الكلاسيكي | ما يفعله التأليف عبر المتصفح |
|---|---|
كتابة papex.json يدويًا عرضة للخطأ (حقول ناقصة، صيغة رديئة) | محرر بصري + تحقق فوري |
| التحقق من البنية يتطلب تثبيت Python / TeX محليًا | يُولَّد .tex الوسيط في المتصفح — لا حاجة لأدوات محلية |
| التغليف والرفع خطوتان منفصلتان | "تصدير" و"نشر" بنقرة واحدة من المحرر |
| فقدان العمل أثناء المسودة | يُحفظ تلقائيًا في localStorage بالمتصفح |
1.2 التبويبات الثلاثة
| التبويب | الغرض |
|---|---|
| البيانات الوصفية | معلومات الورقة، المؤلفون، المراجع، خيارات البناء — محرر بصري لـ papex.json |
| المتن | ورشة أقسام/ملاحق منظّمة لكتابة متن LaTeX |
| تصدير ونشر | تحقق فوري، معاينة ملف الأرشيف، تصدير tar.gz / نشر بنقرة واحدة |
1.3 العلاقة بنظام الإرسال
التأليف عبر المتصفح ليس طريقة إرسال جديدة — بل هو واجهة التأليف لـ "رفع حزمة المصدر". الأرشيف الذي ينتجه متوافق بايتًا بايت مع رفع حزمة المصدر، والنشر يعيد استخدام نفس طرف الخلفية POST /api/submit/archive، متبعًا نفس خط "فك الحزم ← التحقق ← إنشاء الورقة ← ربط رسم الاقتباس ← بناء PDF" (انظر دليل الإرسال §4).
2. نقطة الدخول والصلاحيات
- نقطة الدخول:
/writespace. - توثيق على مستوى الصفحة: يستدعي المكوّن الخادمي
src/app/writespace/page.tsxgetCurrentUser()وredirect("/login")عند غياب التوثيق. - الوسيط: يضيف
src/middleware.ts/writespaceإلىPROTECTED_PREFIXESويضيف/writespace/:path*إلىmatcher، فتُحجب الطلبات غير الموثّقة على الحافة. - صلاحية النشر: النشر في جوهره رفع حزمة مصدر وهو خاضع لنفس قواعد
FORBIDDEN/PAPER_NOT_FOUNDفي دليل الإرسال §4 — عندما يُعلنpaper.idإصدارًا جديدًا، يجب أن تكون لديك صلاحية إرسال على تلك الورقة.
3. التبويب الأول: محرر البيانات الوصفية
يتوافق تبويب البيانات الوصفية مع MetadataEditor. يقسم كتل papex.json الخاصة بـ paper / authors / references / build إلى نماذج بطاقية، مع حقول مطابقة واحدًا إلى واحد مع دليل الإرسال §3.2.
3.1 معلومات الورقة (metaPaper)
العنوان، والعنوان الفرعي، والملخص، والكلمات المفتاحية (مفصولة بفواصل)، والفئة الأساسية (قائمة منسدلة، مطلوبة)، والفئات الثانوية (إضافة/إزالة)، وDOI، والترخيص (قائمة منسدلة، افتراضي CC-BY-4.0)، والمنصة (venue)، وملاحظة الإصدار، واللغة، ومعرّف الورقة (اختياري — إن مُلئ وكان من أوراقك الموجودة، تُرسَل كإصدار جديد).
3.2 المؤلفون (metaAuthors)
- أضف مؤلفين متعددين؛ تدعم كل بطاقة إعادة الترتيب أعلى/أسفل/إزالة.
- الحقول: الاسم (مطلوب)، والانتماء، والبريد، وORCID (فحص صيغة)، والصفحة الرئيسية، ومفتاح المؤلف المراسل، ومفتاح المساهمة المتساوية، والحاشية السفلية، والترتيب.
- يُعرض المؤلف المراسل/المساهمة المتساوية/الحاشية السفلية كحواشٍ
\thanksفي PDF؛ ويظهر ORCID والصفحة الرئيسية أيضًا في الحواشي.
3.3 المراجع (metaReferences)
- أضف مدخلات BibTeX متعددة؛ تشمل الحقول مفتاح الاقتباس (مطلوب، فحص صيغة)، والنوع (قائمة منسدلة، 12 نوعًا من BibTeX)، والعنوان، والمؤلف، والمجلة، وbooktitle، والسنة، وDOI، وURL، وArXiv ID، والصفحات، والمجلد، والعدد، والناشر، والملاحظة.
- غرضان: ① عند النشر، تُربط في رسم اقتباس المنصة عبر
mapReferencesToCitations؛ ② عند التصدير، تُستخدم لتوليدreferences.bibتلقائيًا (انظر §7).
3.4 خيارات البناء (metaBuild)
- أسلوب المراجع:
numeric/authoryear(يُحقن في المستند الرئيسي كـ\documentclass[11pt,bibstyle=authoryear]). - الأعمدة:
1/2(العمودان يحقنانtwocolumn). - خيارات
buildالأخرى (مثلfontsetوdocumentclass) محفوظة للتجميع على جانب الخادم؛ للافتراضات انظرcreateDefaultDraft.
3.5 التحقق الفوري
كل تعديل يمر عبر validateDraft() (src/lib/writespace/manifest.ts)؛ تُشارَك النتيجة مع تبويب تصدير ونشر. القواعد الأساسية:
| الفحص | القاعدة | النوع |
|---|---|---|
schemaVersion | يجب أن يطابق x.y.z | خطأ |
paper.title / abstract / primaryCategoryId | مطلوبة وغير فارغة | خطأ |
paper.id (اختياري) | إن وُجد يجب أن يطابق YYMM.NNNNN | خطأ |
authors | على الأقل 1؛ كل name مطلوب؛ orcid يجب أن يطابق 0000-0000-0000-0000 | خطأ |
sections | على الأقل 1؛ كل file مطلوب؛ id فقط أحرف وأرقام و- و_ | خطأ |
references | كل key مطلوب، محدود بـ A-Za-z0-9_:+.-؛ year ∈ [0, 3000] | خطأ |
| جسم قسم فارغ | تنبيه | تحذير |
"الأخطاء" تمنع النشر؛ "التحذيرات" (مثل جسم قسم فارغ) تنبيهية فقط.
4. التبويب الثاني: ورشة المتن
يتوافق تبويب المتن مع SectionsEditor ويدير متن الورقة والملاحق بشكل هيكلي.
4.1 قائمة الأقسام
- كل قسم (أو ملحق) بطاقة قابلة للطي تحوي: المعرّف/اسم الملف (
file، مثلsections/intro.tex)، وعنوان القسم، والمستوى (section/subsection/subsubsection/chapter/part)، والمتن (منطقة LaTeX)، وعدد المحارف. - يدعم: إضافة قسم، وإضافة ملحق، وتحريك أعلى/أسفل، وإزالة.
- يحدد المستوى الأمر الصادر عند التصدير (
\section{Title}←\input{sections/intro.tex}).
4.2 قواعد محتوى المتن
- ملف القسم
.texمكتوب يدويًا ويدعم LaTeX كاملاً: الرياضيات، والأشكال، والأوامر المخصصة، ومراجع\cite{key}(مطابقة مفاتيح المراجع). - متن القسم غير مُهرَّب (بما يتفق مع دليل الإرسال §3.3)؛ فقط الحقول النصية العادية في "البيانات الوصفية" تُهرَّب.
- زر "إدراج أقسام نموذجية" يكتب خمسة أقسام توضيحية (مقدمة / أعمال ذات صلة / منهج / تجارب / استنتاج) مع معادلات LaTeX، للبدء السريع.
4.3 الملاحق
تشارك مدخلات الملحق بنية القسم وتُصدر بعد \appendix واحدة.
5. التبويب الثالث: تصدير ونشر
يتوافق تبويب تصدير ونشر مع ExportPanel — مخرج التدفق بأكمله.
5.1 حالة التحقق
يعرض نتيجة validateDraft() الحية أعلى الصفحة: "صالح" أو "غير صالح" مع قائمة أخطاء/تحذيرات. يُعطَّل زر النشر ما دامت هناك أخطاء.
5.2 معاينة بيان الحزمة
يعرض ملفات الأرشيف التي ستُنتج (أي مخرجات buildArchiveFiles، §7)، لتتأكد من البنية قبل التنزيل/النشر.
5.3 تصدير tar.gz
انقر تصدير: يُولَّد tar.gz بالكامل في المتصفح ويطلق تنزيلًا (اسم الملف من i18n writespace.expDownloadName).
- بلا اعتماديات: يدوّي
src/lib/writespace/targz.tsتغليف POSIX ustar يدويًا إضافة إلىCompressionStream('gzip')الأصلية — دون تدخل خلفي. - تُجلب أصول القالب (
papex-template.tex/papex.cls) وقت التصدير من/writespace/papex-template.texو/writespace/papex.clsوتُدمج في الأرشيف، لتبقى مكتفية ذاتيًا (يجمّع الخلفية مباشرة عبرlatexmk).
5.4 النشر بنقرة واحدة
انقر نشر: يشغّل نفس خطوات التصدير، ثم يُرسل tar.gz كحقل file في طلب multipart/form-data إلى /api/submit/archive.
- يتطلب النشر
validation.valid === trueمسبقًا. - عند النجاح يعرض "معرّف الورقة + الإصدار" و
warningsالمُعادين، مع رابط "عرض الورقة"، ويمسح علم المسودة المحلية. - عند الفشل يعرض رسالة خطأ الخلفية مضمّنة (التعيين في جدول أخطاء دليل الإرسال §4).
6. الحفظ التلقائي واستعادة المسودة
- تُحفظ المسودة (
manifest+ متن كل قسم) تلقائيًا فيlocalStorageبالمتصفح (المفتاح:papex-writespace-draft)، بتردّد 400ms — تنجو من إغلاق الصفحة. - إعادة فتح
/writespaceتستعيد آخر مسودة تلقائيًا وتعرض "تمت استعادة المسودة المحلية"؛ بعد التحرير تعرض "حُفظ تلقائيًا". - زر جديد العلوي يطلب التأكيد، ويمسح
localStorage، ويعيد التعيين إلى مسودة فارغة (مع قسم مقدمة نموذجي واحد).
المسودات تعيش فقط في المتصفح المحلي؛ تبديل الأجهزة أو مسح بيانات المتصفح يفقدها. للعمل المهم، تذكّر التصدير أو النشر.
7. بنية الأرشيف المُصدَّر
يُجمَّع tar.gz الناتج عن التصدير / النشر عبر buildArchiveFiles() وهو متوافق تمامًا مع ما يتوقعه الخلفية papex-archive.ts:
my-paper.tar.gz
├── papex.json # بيان المحرر، مُسلسَل (مسافة بادئة 2)
├── papex-template.tex # المستند الرئيسي مع حقن bibstyle/twocolumn
├── papex.cls # صنف المستند (مُجمَّع من /writespace/papex.cls)
├── references.bib # مولَّد تلقائيًا من المراجع (يُحذف إن لم يوجد)
├── sections/
│ ├── intro.tex # القسم الذي كتبته في "المتن"
│ └── …
└── _papex_*.tex # مقاطع وسيطة مولَّدة تلقائيًا (لا تُحرّر)
├── _papex_meta.tex # العنوان/المؤلفون/الانتماءات/الكلمات المفتاحية/العنوان الجاري
├── _papex_abstract.tex # الملخص
├── _papex_sections.tex # تجميع \section + \input
├── _papex_backmatter.tex # الشكر/التمويل
└── _papex_appendices.tex # \appendix + الملاحق- تُنتج ملفات
_papex_*.texعبرgenMeta/genAbstract/genSections/genBackmatter/genAppendices؛ تمر الحقول النصية العادية عبرlatexEscapeبمرور واحد، بينما تُدخل أجسام الأقسام\inputكما هي. - يمكن رفع هذا الأرشيف يدويًا على صفحة "رفع حزمة المصدر"، أو إرساله تلقائيًا عبر زر النشر — كلاهما متكافئ.
8. ملاحظات التنفيذ
| الشاغل | التنفيذ |
|---|---|
| نموذج البيانات | src/lib/writespace/manifest.ts: أنواع مطابقة مع papex.schema.json + papex-json.ts، واجهة أمامية صرفة، بلا استيراد خادمي |
| توليد LaTeX | src/lib/writespace/latex-gen.ts: ينقل منطق papex-build.py إلى TS؛ التهريب يستخدم مسح محارف بمرور واحد (بما يتفق مع papex-build.py الثابت، يتفادى إعادة تهريب \textbackslash{}) |
| التغليف | src/lib/writespace/targz.ts: ustar مكتوب يدويًا + CompressionStream('gzip')، بلا اعتماديات، متصفح صرف |
| أصول القالب | public/writespace/papex.cls + papex-template.tex (منسوخة من papex-latex/، مُطبَّعة LF)، تُجلب وقت التشغيل إلى الأرشيف |
| التنسيق | src/components/writespace/writespace-client.tsx: ثلاثة Tabs + بقاء المسودة + تصدير/نشر |
| التعريب | src/i18n/dictionaries/{zh,en}.ts كتلة writespace (~70 مفتاحًا)، مطابقة لترقيم الواجهة |
9. الأمان والحدود
- الصلاحيات: يتطلب كل من الدخول والنشر تسجيل دخول؛ يجب أن تكون الورقة الهدف للإصدار الجديد للمستخدم الحالي (أو دور ذي صلاحية)، وإلا يعيد الخلفية
FORBIDDEN. - بلا استمرارية على الخادم: كل التوليد والتغليف يحدث في ذاكرة المتصفح؛ تغادر الملفات الجهاز فقط عند النقر على تنزيل/نشر. ما زالت المنصة تطبّق صندوق TeX، وحدود الحجم، وتعطيل الهروب إلى الصدفة من دليل الإرسال §6/§7.
- دعم المتصفح: يحتاج
CompressionStream('gzip')متصفحًا حديثًا (Chrome/Edge 80+، Firefox 113+، Safari 16.4+)؛ عند غيابه، يفشل التصدير برسالة ودية. - حد 50MB: يمر النشر عبر
/api/submit/archiveويخضع لنفس سقف 50MB.
10. الأسئلة الشائعة
س: التأليف عبر المتصفح مقابل رفع حزمة المصدر — أيّهما أستخدم؟ أيّهما شئت. يناسب التأليف عبر المتصفح المؤلفين الذين لا يريدون سطر الأوامر ويرغبون في تحقق فوري؛ ويرفع حزمة المصدر مناسب لمن لديهم مشروع TeX محلي ويريدون تحكمًا دقيقًا عبر papex-build.py. كلاهما ينتج نتائج متطابقة في قاعدة البيانات.
س: هل يمكن رفع tar.gz المُصدَّر يدويًا على صفحة "رفع حزمة المصدر"؟ نعم، وهو متكافئ. الأرشيف المُصدَّر يُجمّع مسبقًا papex.cls و papex-template.tex، فلا يحتاج الخلفية لنسخهما من PAPEX_LATEX_DIR.
س: استخدمت \cite{key} في المتن لكن الاقتباس لم يُربط بعد النشر؟ يرتبط الاقتباس بوجود doi / arxivId للمرجع يطابق ورقة موجودة بالفعل على المنصة؛ بينما تدخل المدخلات التي تحمل url / title فقط في رسم الاقتباس لكنها لا تشكّل رابطًا داخليًا. تأكد من دقة DOI / ArXiv ID للمرجع.
س: هل تُزامَن المسودات مع السحابة؟ لا. المسودات تعيش فقط في localStorage بالمتصفح؛ تبديل الأجهزة أو مسح التخزين المؤقت يفقدها. اجعل من عادتك التصدير أو النشر.
س: هل تتلف صيغ $...$ في المتن؟ لا. يُكتب .tex للقسم كما هو (بلا تهريب)؛ تُعرض الصيغ بواسطة تجميع XeLaTeX الخلفي. فقط الحقول النصية العادية في "البيانات الوصفية" تُهرَّب.
س: لا PDF مباشرة بعد النشر؟ كما في الأسئلة الشائعة لدليل الإرسال: يعتمد على ما إذا كان الخادم مهيّأ بـ TeX Live؛ عند غيابه، يكون pdfUrl فارغًا وتعرض الصفحة "يُبنى PDF في الخلفية".