مولّد جداول Markdown
أنشئ جدول Markdown من CSV أو TSV أو JSON أو أعد محاذاة جدول موجود، مع محاذاة لكل عمود وحشو يراعي عرض المحارف. يعمل داخل متصفحك.
قُرئ بصيغة CSV. لم يدل شيء على الصيغة، فهذا هو الخيار الاحتياطي — اختر صيغة أعلاه إن كان غير صحيح.
محاذاة الأعمدة
| city | country | population |
| --------- | ------- | ---------- |
| 東京 | Japan | 37400068 |
| Delhi | India | 28514000 |
| São Paulo | Brazil | 21650000 |الأعمدة: 3 · الصفوف: 3
أربع صيغ للدخل، وصيغة واحدة للخرج
جدول Markdown سهل الكتابة ومتعب الصيانة. تكفي إضافة كلمة واحدة إلى خلية كي تخرج كل الشرطات الرأسية تحتها عن الصف، وبناء جدول من بيانات لديك أصلاً — نتيجة استعلام، تصدير من جدول بيانات، رد من واجهة برمجية — يعني إعادة كتابتها يدوياً. تأخذ هذه الأداة البيانات بالشكل الذي هي عليه وتعيد جدولاً نظيفاً بلهجة Markdown الخاصة بـ GitHub.
تقرأ الأداة أربع صيغ، وتخبرك أيها اختارت بدل أن تقرر بصمت:
- جدول Markdown، فالجدول الذي فقد محاذاته يُلصق كما هو ويُعاد ضبطه.
- CSV، مُحلَّل وفق RFC 4180 — فالحقل بين علامتي اقتباس قد يحوي فواصل وعلامات اقتباس وحتى فواصل أسطر، وكلها تنجو.
- TSV، وهو ما تحصل عليه حين تنسخ نطاقاً من جدول بيانات أو من عميل قاعدة بيانات.
- مصفوفة JSON، إمّا من كائنات (فتصير المفاتيح أعمدة) وإمّا من مصفوفات (فيصير الصف الأول ترويسة).
يبحث الكشف أولاً عن أوضح دليل: القوس المربع في البداية لا يكون إلا JSON، وصف الشرطات لا يكون إلا صفاً فاصلاً في Markdown، ومحرف الجدولة في السطر الأول لا يكون إلا TSV. أما الفصل بالفواصل فهو ما تبقّى، ولذلك يُعلَن كخيار احتياطي لا كاكتشاف — فإن اضطرت الأداة إلى التخمين قالت ذلك، وبإمكانك تجاوزها من قائمة الصيغة.
أما الخرج فهو Markdown ولا شيء غيره. تحويل جدول إلى CSV أو JSON عمل آخر، ولهذا الموقع أدوات تقوم به؛ ومحوّل عام ثانٍ لن يفعل سوى منافستها وجعل شرح هذه الصفحة أصعب.
الخلية تُحشى بالعرض لا بعدد المحارف
اصطفاف الشرطات الرأسية يعني حشو كل خلية في العمود إلى العرض نفسه، وهذا يستلزم معرفة عرض الخلية. والجواب البديهي — عُدَّ المحارف — خاطئ في أغلب نظم الكتابة في العالم، وخاطئ في الاتجاهين معاً.
الخط ثابت العرض ليس محرفاً واحداً لكل عمود. فالمحرف الصيني أو الياباني، والكانا، والمقطع الهنغولي، والحرف اللاتيني كامل العرض، وأغلب الرموز التعبيرية تُرسم بضعف عرض الحرف اللاتيني تماماً. أما علامة التشكيل — حركة عربية، أو نقطة عبرية، أو لكنة لاتينية — فتُرسم فوق الحرف الذي قبلها ولا تأخذ عرضاً البتة. والحشو بعدد المحارف يُخرج عمود اليابانية أقصر مما ينبغي وعمود النص المشكول أطول مما ينبغي.
'日本語'.length // 3 UTF-16 code units
[...'日本語'].length // 3 code points
displayWidth('日本語') // 6 columns in the editorلذلك يُقاس الحشو بأعمدة العرض. يُقسَّم النص أولاً إلى عناقيد كتابية — ما يعدّه القارئ محرفاً واحداً، فيبقى الرمز التعبيري المركَّب من عدة نقاط شفرية وحدة واحدة — ثم يُقاس كل عنقود بخاصية East_Asian_Width من قاعدة بيانات محارف Unicode. وهذه الخاصية هي الشيء الوحيد الذي لا يستطيع المتصفح الإجابة عنه بنفسه: فـ JavaScript تكشف الفئة والكتابة وحالة الأحرف عبر التعابير النمطية، لكنها لا تكشف هذه، ولهذا يُشحَن مع الصفحة جدول صغير بنطاقات العرض المضاعف. وكل ما عدا ذلك يأتي من المحرك.
وهناك فئة تُعامَل عمداً على أنها ضيّقة. يصنّف Unicode مجموعة من المحارف — رسوم الإطارات، وبعض الحروف اليونانية والسيريلية، وعدة علامات ترقيم — بأنها «ملتبسة»: عريضة في خط شرق آسيوي قديم، وضيّقة في كل مكان آخر. وملف Markdown يُقرأ في محرر افتراضه لاتيني، فتُحسب بعمود واحد، وهو ما تفعله الطرفيات والمحررات التي ستفتح فيها الملف.
ما لا يستطيع جدول Markdown حمله
للصيغة حدّان صارمان، والبيانات الحقيقية تصطدم بهما معاً. لا تستطيع الخلية أن تحوي شرطة رأسية عارية، لأنها هي ما يفصل بين الخلايا؛ بل يجب كتابتها مهرَّبة. وصف الجدول سطر واحد، فلا تستطيع الخلية أن تحوي فاصل سطر أصلاً — وهو أمر يحق لحقل CSV تماماً أن يحويه.
يُعاد كتابة الاثنين، ويُبلَّغ عن كل إعادة كتابة مع عدد الخلايا المتأثرة وموضع أولها. وهذا هو المقصود: فالأداة التي تحوّل عنوانك ذا السطرين إلى سطر واحد بصمت قد أتلفت بياناتك دون أن تخبرك. يصير فاصل السطر افتراضياً وسم فاصل، وهو ما يعرضه GitHub وGitLab وأغلب العارضات سطراً جديداً داخل الخلية؛ فإن كان عارضك يحذف HTML فاجعله مسافة.
والصف الأطول من الترويسة هو الحالة الثالثة. لهجة Markdown في GitHub تُسقط الخلايا الزائدة ببساطة، وهذا فقدان صامت للبيانات. أما هنا فيُوسَّع الجدول بدلاً من ذلك، بخلايا ترويسة فارغة، ويُبلَّغ عن عدم التطابق — فترويسة غريبة الشكل يمكنك إصلاحها خير من عمود لا تعلم به أبداً. والصف الأقصر من الترويسة يُحشى بخلايا فارغة ويُبلَّغ عنه بالطريقة نفسها.
أما الشرطة المائلة العكسية فتُعامَل بعناية أكبر مما تفعله معظم الأدوات. فهي لا تُضاعف إلا حيث يمكن أن تبتلع الشرطة الرأسية التي تليها: قبل شرطة رأسية في النص، أو في آخر الخلية تماماً حيث يأتي الفاصل. وفي كل موضع آخر تُترك كما هي، فيبقى مسار Windows في الخلية مقروءاً بدل أن يتحول إلى صف من الشرطات المزدوجة.
المحاذاة تسكن في الصف الفاصل
صف الشرطات تحت الترويسة يؤدي وظيفتين. فهو ما يجعل الكتلة جدولاً أصلاً، ونقطتاه تحددان محاذاة كل عمود: نقطتان على اليسار تعني المحاذاة إلى اليسار، ونقطتان على اليمين تعني المحاذاة إلى اليمين، ونقطتان على الطرفين تعني التوسيط. ومن دون نقطتين يستعمل العارض افتراضه الخاص، وهو اليسار في كل تطبيق، لكنه ليس الشيء نفسه كأن تطلب اليسار.
ولكل عمود هنا أداة تحكم خاصة به، لأن هكذا تُستعمل المحاذاة فعلاً — النص إلى اليسار، والأرقام إلى اليمين، وعمود الحالة في الوسط. وحين تلصق جدولاً فيه محاذاة أصلاً، تُقرأ من الصف الفاصل وتظهر في تلك الأدوات، فلا تُهدر بصمت أعمال من ضبطها قبلك عند إعادة التنسيق.
والحشو يتبع المحاذاة كذلك. فالعمود المحاذى إلى اليمين يُحشى من اليسار، فيبدو المصدر مصطفاً كما سيبدو الجدول المعروض. وMarkdown يتجاهل تلك المسافات تماماً، وهذا بالضبط ما يجعل استعمالها لتحسين قراءة المصدر بلا ثمن.
محشوّ أم مضغوط، ولماذا يختلف النص من اليمين إلى اليسار
الحشو يستحق عناءه في مستند يحرره إنسان، ويكلّف شيئاً في مستودع شفرة. فكل خلية تكبر تُعيد حشو عمودها كله، فيظهر تغيير كلمة واحدة في الفرق بوصفه تغييراً في كل صفوف الجدول. أما الشكل المضغوط فيكتب أضيق جدول مسموح به — بلا حشو، وثلاث شرطات لكل عمود — فيبقي الفرق محصوراً في الصفوف التي تغيّرت فعلاً. وكلاهما يُعرض بالشكل نفسه. أما الشرطات في أول كل صف وآخره فليست مطلوبة في لهجة GitHub لكن بعض العارضات القديمة تطلبها، ولهذا هي مفتاح لا قرار.
والحشو لا ينفع البتة في جدول فيه عربية أو عبرية، والأداة تقول ذلك بدل أن تتظاهر. فالمسافات تُحسب حساباً صحيحاً، لكن المحرر يرتّب السطر المختلط بالخوارزمية ثنائية الاتجاه: يُعاد ترتيب المقطع المكتوب من اليمين إلى اليسار، وتتحرك الشرطات المحيطة به معه. تكون المحارف في مواضعها الصحيحة ومع ذلك لا تبدو الشرطات مصطفة، لأن الموضع البصري والموضع المنطقي ليسا شيئاً واحداً في مثل هذا السطر. ولا حيلة في ذلك، فحين يكون في الخلية نص من اليمين إلى اليسار تُبلغ الأداة عنه وتقترح الشكل المضغوط، حيث لا محاذاة تخيب فيها.
وللسبب نفسه يُعرض خرج Markdown في هذه الصفحة من اليسار إلى اليمين دائماً، حتى وأنت تقرأ الموقع بالعربية أو العبرية. فهو شفرة مصدرية، وللشفرة المصدرية اتجاهها الخاص.
أين يعمل هذا
كل شيء يجري داخل متصفحك. يُحلَّل الجدول ويُقاس ويُعاد بناؤه على جهازك، ولا يُرفع شيء مما تلصقه ولا يُخزَّن ولا يُسجَّل — وهذا مهم، لأن الجداول التي يحتاج الناس إلى إعادة تنسيقها غالباً ما تكون نتائج استعلامات وتصديرات لا بيانات عامة.
الأسئلة الشائعة
- هل تُرسَل بياناتي إلى خادم؟
- لا. التحليل وقياس العرض والخرج كلها تُحسب داخل متصفحك، ولا يُرفع شيء مما تلصقه ولا يُسجَّل.
- كيف أحوّل ملف CSV إلى جدول Markdown؟
- الصقه فحسب. تتعرف الأداة على النص المفصول بفواصل، وتأخذ الصف الأول ترويسةً، وتعيد جدول Markdown محاذى. والحقول بين علامتي اقتباس التي تحوي فواصل أو علامات اقتباس أو فواصل أسطر تُعالَج معالجة صحيحة، ويُبلَّغ عن كل ما أُعيدت كتابته ليناسب الصيغة.
- لماذا لا يزال جدولي المكتوب باليابانية أو الصينية غير مصطف؟
- تحقق من الخط. يفترض الحشو خطاً ثابت العرض يُرسم فيه المحرف الصيني بضعف عرض الحرف اللاتيني تماماً، وهو ما تستعمله الطرفيات ومحررات الشفرة. أما في خط متناسب، أو خط لا تبلغ رسومه الشرقية ضعف العرض بالضبط، فلن يصف أي حشو الأعمدة — استعمل هناك الشكل المضغوط.
- ماذا يحدث لفاصل السطر داخل الخلية؟
- يصير وسم فاصل افتراضياً، لأن صف جدول Markdown سطر واحد ولا يسع فاصلاً حقيقياً. حوّله إلى مسافة إن كان عارضك يحذف HTML. وفي الحالتين تُبلغ الأداة عن الخلايا التي غيّرتها.
- لماذا يضيف صفي ذو الخلايا الزائدة عموداً فارغاً؟
- لأن البديل هو فقدان تلك الخلايا. لهجة Markdown في GitHub تُسقط كل ما يتجاوز عرض الترويسة، فيُوسَّع الجدول بخلايا ترويسة فارغة بدلاً من ذلك ويُبلَّغ عن عدم التطابق. احذف العمود أو سمّه بعد أن ترى ما كان فيه.
- أستعمل الشكل المحشوّ أم المضغوط؟
- المحشوّ لمستند يقرأه الناس ويحررونه يدوياً — ملف README أو مذكرة تصميم — لأن المصدر يبقى مقروءاً. والمضغوط لكل ما هو تحت إدارة الإصدارات ويتغير جدوله كثيراً: فالحشو يعني أن خلية واحدة معدَّلة تُعيد حشو العمود كله وتظهر في الفرق وكأن كل الصفوف تغيّرت.
- هل أحتاج إلى الشرطات في أول كل صف وآخره؟
- لهجة Markdown في GitHub لا تطلبها، ولا تطلبها أغلب العارضات الحديثة. لكن بعض المحلّلات القديمة تطلبها، وهي تسهّل قراءة جدول يُحرَّر يدوياً، ولذلك تعمل افتراضياً ويمكن إيقافها.
- لماذا لا تستطيع الأداة محاذاة جدول فيه عربية أو عبرية؟
- لأن المحرر يعيد ترتيب السطر. التخطيط ثنائي الاتجاه يضع المقطع المكتوب من اليمين إلى اليسار في ترتيب بصري، وتتحرك الشرطات المحيطة به معه، فيصير الحشو صحيحاً حسابياً وعديم الفائدة بصرياً. تُبلغ الأداة عن ذلك وتقترح الشكل المضغوط بدل أن تنتج جدولاً يبدو مكسوراً.