Skip to content

التأليف عبر المتصفح (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، واجهة أمامية صرفة، بلا استيراد خادمي
توليد LaTeXsrc/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 في الخلفية".

Papex is open source under the Apache-2.0 license.