استعادة البيانات "الخام" الحقيقية التي أنشأت منشورًا؟

إذا قمت بلصق بعض كود HTML في موضوع لإنشائه، يقوم Discourse بإعادة تنسيق HTML تلقائيًا (أي “يطهيه”)، مع الاحتفاظ ببعض (وليس كل) التنسيق الأساسي، وإزالة وسوم HTML من العرض.

هل توجد طريقة لاستعادة كود HTML الأصلي الذي قمت بلصقه في الموضوع عند إنشائه؟ أقرب ما أجد هو إجراء استدعاء API باستخدام “raw=true” في نقطة النهاية ورؤية الاستجابة تحت response.data.post_stream.posts[0].raw، كما هو موضح هنا.

ومع ذلك، فإن النص “الخام” الذي يعود ليس هو كود HTML الأصلي. لست متأكدًا مما هو بالضبط — يبدو وكأنه الموضوع المطبوخ الأساسي بعد إزالة جميع المسافات.

هل توجد طريقة لاستعادة كود HTML الأصلي الذي قمت بلصقه؟

3 إعجابات

بالتأكيد، هناك مسار لعرض محتوى المنشور الخام. استخدم منشورك كمثال. الرابط هو

https://meta.discourse.org/t/get-back-the-real-raw-data-that-created-a-post/189183

لعرض المحتوى الخام، استبدل /t/slug بـ /raw.

https://meta.discourse.org/raw/189183
7 إعجابات

شكرًا لك، لكن يبدو أن هذا لا يعمل بالنسبة لي. أود استعادة البيانات التي تحافظ على تنسيق HTML الأصلي تمامًا كما كان عند لصقه لأول مرة—فإذا احتوى HTML الأصلي على وسم div، على سبيل المثال، أريد أن يحتوي البيانات المسترجعة على ذلك الوسم.

ما وجدته في استجابة “raw”، على سبيل المثال، يحتوي على تنسيق Markdown بينما لم يكن هناك أي تنسيق في البيانات الأصلية.

سأحاول إعداد مثال الآن لتوضيح ما أعنيه.

إعجاب واحد (1)

Ok. Here’s my attempt at an example:

I wrote a few lines of different formatting in a word processor, and the html produced was:


Original HTML:

<style>
     ...
     /* Style Definitions */
     table.MsoNormalTable
    	{mso-style-name:"Table Normal";
    	mso-tstyle-rowband-size:0;
    	mso-tstyle-colband-size:0;
    	mso-style-noshow:yes;
    	mso-style-priority:99;
    	mso-style-parent:"";
    	mso-padding-alt:0in 5.4pt 0in 5.4pt;
    	mso-para-margin:0in;
    	mso-pagination:widow-orphan;
    	font-size:12.0pt;
    	font-family:"Calibri",sans-serif;
    	mso-ascii-font-family:Calibri;
    	mso-ascii-theme-font:minor-latin;
    	mso-hansi-font-family:Calibri;
    	mso-hansi-theme-font:minor-latin;
    	mso-bidi-font-family:"Times New Roman";
    	mso-bidi-theme-font:minor-bidi;}
    </style>
    <![endif]-->
    </head>

    <body lang=EN-US style='tab-interval:.5in;word-wrap:break-word'>
    <!--StartFragment-->

    <p class=MsoNormal>Here is some text. Font family = Calibri, size 12pt<o:p></o:p></p>

    <p class=MsoNormal><o:p>&nbsp;</o:p></p>

    <p class=MsoNormal><b>This text is bold</b>.<o:p></o:p></p>

    <p class=MsoNormal><o:p>&nbsp;</o:p></p>

    <p class=MsoNormal><i>This text is italicized</i>.<o:p></o:p></p>

    <p class=MsoNormal><o:p>&nbsp;</o:p></p>

    <p class=MsoNormal><span style='font-size:18.0pt'>This text is in a larger font
    = Calibri, size 18</span>.<o:p></o:p></p>

    <p class=MsoNormal><o:p>&nbsp;</o:p></p>

    <p class=MsoNormal align=center style='text-align:center'><span
    style='font-size:11.0pt;font-family:"Garamond",serif'>And here is some more random
    text that is centered = Garamond, size 11. Lorem ipsum dolor sit amet,
    consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et
    dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco
    laboris nisi ut aliquip ex ea commodo consequat.<o:p></o:p></span></p>

    <!--EndFragment-->
    </body>

    </html>

Cooked Discourse Post:

If I paste this html into a discourse post, it looks like this (after it goes through the “cook” process):

Here is some text. Font family = Calibri, size 12pt

 

This text is bold.

 

This text is italicized.

 

This text is in a larger font = Calibri, size 18.

 

And here is some more random text that is centered = Garamond, size 11. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.


What I’m Trying to Get Back

It’s fine for Discourse to cook the post and display it like it does. But what I want now is to be able to later take a post and get back the original, underlying HTML. So the data I get back should look like this:

<body lang=EN-US style='tab-interval:.5in;word-wrap:break-word'>
<!--StartFragment-->

<p class=MsoNormal>Here is some text. Font family = Calibri, size 12pt<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal><b>This text is bold</b>.<o:p></o:p></p>

(etc.)

Right now if I plug in the “raw” endpoint like you provided, it does not provide this html. Rather, it just provides the text with, it seems, most formatting and spacing removed.

Is it possible to get the original, underlying html back?

إذن، لا يزال الأمر غير واضح بالنسبة لي، أو أنني أغفلت خطوة ما. لقد أنشأت منشورًا للتو على try.discourse.org: https://try.discourse.org/t/testing-html-cooking/1405. المحتوى الخام هو https://try.discourse.org/raw/1405. يبدو المحتوى الخام بالتأكيد كما تقول إنه يجب أن يبدو.

هل يمكنك تزويدي بتعليمات خطوة بخطوة حول كيفية تكرار ذلك؟ لقد أخذت “HTML الأصلي” الذي شاركتُه أعلاه، وأضفت وسمي <html> و<head> في الأعلى ليكون HTML صالحًا، ثم أنشأت منشورًا يحتوي على HTML في الجسم.

إعجاب واحد (1)

أنت محق. الرابط الخام يبدو كما أقصد. لست متأكداً من سبب عدم نجاح هذا من قبل. سأختبر بعض الأمور ثم أرد.

إعجاب واحد (1)

أعتقد أن المشكلة تكمن في أن HTML الذي تريده يتحول عند لصقه في المتصفح، وبالتالي لا يصل ذلك المحتوى أبدًا إلى raw.

محتوى من مقتطفك يمكنك رؤيته في raw

انظر إلى https://meta.discourse.org/raw/189183/7

هذا نص. نوع الخط = Calibri، الحجم 12pt

 

هذا النص عريض.

لكن إذا قمت بنسخ المحتوى من Word ثم لصقه، فإن كل HTML يتحول إلى markdown على الواجهة الأمامية.

إعجاب واحد (1)

شكرًا لكم جميعًا. نعم، @pfaffman، هذا هو على الأقل جزء من سبب ارتبابي هنا.

لنفترض أن الهدف هو النسخ من برنامج Word، ثم اللصق في موضوع على Discourse؛ ثم القدرة لاحقًا على عرض بيانات الموضوع “الخام” واستعادة التنسيق الأصلي من Word.

هل هذا ممكن؟


تحرير: إليك ربما مثالًا أوضح (نأمل ذلك). إليك كود HTML:

<!DOCTYPE html>
<html>
<body>

<h1>Heading</h1>

<p style="font-size: 35pt">This text should be very big</p>

</body>
</html>

إذا قمت بطباعة المخرجات (على سبيل المثال، في محرر “جرّب ذلك” في W3Schools هنا)، ستنتج سطرين من النص، حيث تظهر عبارة “This text should be very big” بحجم أكبر من السطر الأول، وهو ما يتوافق مع تنسيق “font-size: 35pt”.

إذا قمت بنسخ تلك المخرجات (وليس كود HTML نفسه)، ثم لصقها في معظم الأماكن، يتم الاحتفاظ بالتنسيق. على سبيل المثال، إذا قمت بلصقها في Gmail، يتم الاحتفاظ بالتنسيق، وإذا قمت بلصقها في Microsoft Word، يتم الاحتفاظ بالتنسيق أيضًا؛ وفي الحالتين، يكون السطر الثاني، بشكل صحيح، أكبر من السطر الأول.

أما في Discourse، فإن التنسيق يُفقد حتى في نافذة محرر “الخام”: يُزال كل التنسيق، باستثناء إضافة علامة “#” الخاصة بـ Markdown إلى عنصر h1.

لذا، إذا قمت بنسخ كود HTML الفعلي ولصقه في المحرر، فإن كود HTML يُحفظ بالفعل ويمكنني استعادته بصيغته الخام. لكن إذا قمت بلصق نتيجة كود HTML، فإن التنسيق يُفقد، حتى في الصيغة الخام.

عندما ألصق المخرجات في Gmail أو Word ويحتفظان بالتنسيق، فهذا يعني أنهما يحفظان كود HTML. أما Discourse، فيبدو أنه يزيل كود HTML عند لصق مخرجات HTML.

هل من الممكن عدم إزالة كود HTML؟

لا. يمكنك النقر على محرر النصوص ومعاينة النص الخام الذي يتم إنشاؤه عند اللصق من برنامج Word. هذا كل ما في الأمر، لأن سحر التحويل من الحافظة إلى لغة الترميز المصغرة (Markdown) يحدث داخل المتصفح بين لحظة اللصق ولحظة ظهور النص في نافذة المحرر.

3 إعجابات

إليك سوء الفهم الجوهري: النص الخام (raw) هو بتنسيق Markdown وليس HTML.

لدينا سحر :sparkles: يحول كود HTML إلى Markdown عند لصقه في محرر الكتابة.

4 إعجابات

وما يزيد الأمر إرباكًا هو أن الـ Markdown يمكن أن يحتوي على HTML. :man_shrugging:

3 إعجابات

لكن هذا التحويل لا يحدث (في المحرر) إذا قمت بلصق كود HTML فعلي. هذا ما أعتقد أنني فاتني سابقًا.

أو ربما، كما قال @pfaffman، يحدث التحويل بالفعل بغض النظر عن الأمر، لكن Markdown يمكنه الاحتفاظ بـ HTML إذا تم لصقه ككود مباشر، وليس إذا تم لصق مخرجات الكود.

صحيح، يجب أن يكون نوع المحتوى في الحافظة text/html لكي يعمل.

إعجابَين (2)

هل يمكن الحفاظ على تنسيقات أخرى، مثل RTF (تنسيق النص الغني)، في الماركداون كما هو الحال مع HTML؟

لا يتم «الحفاظ» على HTML بحد ذاته في التنسيق، بل إن بعض العلامات المهمة مدعومة (مثل التأكيد) حيث نحاول اتباع قانون بوستل حيث لا يسبب ذلك مشاكل.

ما هي المشكلة التي تحاول حلها؟

الهدف هو فهم كيفية عمل العملية (وهو أمر ذو صلة بعدة مشاريع). وقد ساعدت هذه المحادثة بالفعل في ذلك. ما زلت أتساءل عما إذا كان بإمكانك الوصول إلى النص بتنسيقه الأصلي عند النسخ من برنامج مايكروسوفت وورد.

لا. ستحتاج إلى البحث في كود جافا سكريبت الذي يعالجه عند اللصق.

إعجاب واحد (1)

ويرجع ذلك إلى معالجة “تحويل HTML إلى Markdown” التي تحدث عند اللصق.

إليك ملف المصدر ذي الصلة. ستلاحظ عدة عناصر خاصة بمعالجة Microsoft Word (مثل MsoListParagraphCxSpFirst).

https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/app/lib/to-markdown.js

لضمان حصولك على نص خام، قم بتمرير النص الذي تلصقه عبر برنامج المفكرة أو ما شابه أولاً.

إعجابَين (2)

هذا مفيد جدًا. فقط للتوضيح: لماذا قد يكون لتمرير النص عبر Notepad فرق؟

فعل ذلك سيزيل جميع تنسيقات Word ويترك لك النص العادي فقط.

يحدث هذا لأنه عند “نسخ” شيء ما، تعرض التطبيق في الواقع عدة عروض مختلفة للبيانات للتطبيقات التي تلصقها فيها. اختار Discourse النسخة “المميزة” مع جميع تنسيقات Word، بينما ستختار Notepad النسخة “العادية”. من خلال تمريره عبر Notepad، تترك النسخة “العادية” فقط ليراها Discourse.