Récupérer les données "brutes" réelles qui ont créé un post ?

Si je colle du HTML dans un sujet pour en créer un, Discourse reformate automatiquement le HTML (il le « cuisine »), en conservant une partie (mais pas tout) de la mise en forme sous-jacente, et en supprimant les balises HTML de l’affichage.

Existe-t-il un moyen de récupérer ultérieurement le HTML original que j’ai collé dans le sujet lors de sa création ? La solution la plus proche que je trouve consiste à effectuer un appel API avec « raw=true » dans le point de terminaison et à consulter la réponse sous response.data.post_stream.posts[0].raw, comme décrit ici.

Cependant, le texte « raw » retourné n’est pas le HTML original. Je ne suis pas sûr de savoir exactement ce que c’est — cela ressemble au sujet « cuisiné » de base, avec tous les espaces supprimés.

Existe-t-il un moyen de récupérer ce HTML original que j’ai collé ?

3 « J'aime »

Bien sûr, il existe une route pour afficher le contenu brut d’un message. Utilisez votre message comme exemple. L’URL est

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

Pour voir le contenu brut, remplacez /t/slug par /raw.

https://meta.discourse.org/raw/189183
7 « J'aime »

Merci, mais cela ne semble pas fonctionner pour moi. Je souhaiterais obtenir des données qui conservent le HTML exact tel que je l’ai initialement collé — donc si le HTML original contenait une balise div, par exemple, je veux que les données retournées contiennent cette balise div.

Ce que j’ai trouvé dans la réponse « raw », par exemple, contient du formatage Markdown alors que les données originales n’en avaient pas.

Je vais essayer de préparer un exemple maintenant pour illustrer ce que je veux dire.

1 « J'aime »

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?

Je ne suis toujours pas sûr de comprendre, ou j’ai peut-être manqué une étape. Je viens de créer un sujet sur try.discourse.org : https://try.discourse.org/t/testing-html-cooking/1405. Le contenu brut se trouve à l’adresse https://try.discourse.org/raw/1405. Ce contenu brut ressemble bien à ce que vous aviez décrit.

Pourriez-vous me fournir des instructions étape par étape pour reproduire cela ? J’ai pris le « HTML original » que vous avez partagé ci-dessus, ajouté une balise <html> et une balise <head> au début pour qu’il s’agisse d’un HTML valide, puis créé un sujet avec ce HTML dans le corps du message.

1 « J'aime »

Tu as raison. Le lien brut ressemble bien à ce que je voulais dire. Je ne sais pas pourquoi cela ne fonctionnait pas avant. Je vais tester quelques choses et je te répondrai.

1 « J'aime »

Je pense que le problème vient du fait que le HTML que vous souhaitez est converti lorsque vous collez dans le navigateur, de sorte que ces éléments n’atteignent jamais raw.

Éléments de votre fragment visibles dans raw

Voir https://meta.discourse.org/raw/189183/7

Voici un texte. Famille de police = Calibri, taille 12pt

 

Ce texte est en gras.

Mais si vous copiez le contenu depuis Word puis le collez, tout le HTML est converti en Markdown côté client.

1 « J'aime »

Merci à tous. Oui, @pfaffman, c’est en partie ce qui cause une partie de ma confusion ici.

Imaginons que l’objectif soit de copier depuis Word, puis de coller dans un sujet Discourse ; et qu’ensuite, on puisse consulter les données « brutes » du sujet et retrouver la mise en forme originale de Word.

Est-ce possible ?


EDIT : Voici peut-être un exemple plus clair (j’espère). Voici du HTML :

<html>
<body>

<h1>Titre</h1>

<p style="font-size: 35pt">Ce texte devrait être très grand</p>

</body>
</html>

Si j’imprime le résultat (par exemple, dans l’éditeur « Essayez-le » de W3Schools ici), cela produit deux lignes de texte, avec les mots « Ce texte devrait être très grand » affichés plus grands que la première ligne, ce qui est cohérent avec le style « font-size: 35pt ».

Si je copie ce résultat (pas le code HTML, mais le rendu), puis que je le colle dans la plupart des endroits, la mise en forme est conservée. Par exemple, si je le colle dans Gmail, la mise en forme est conservée, et si je le colle dans Microsoft Word, elle l’est aussi : dans les deux cas, la deuxième ligne est, correctement, plus grande que la première.

Dans Discourse, en revanche, la mise en forme est perdue, même dans la fenêtre de l’éditeur brut : toute la mise en forme est supprimée, sauf qu’un « # » Markdown est ajouté au h1.

Donc, si je copie le code HTML réel et que je le colle dans l’éditeur, alors oui, le code HTML est préservé et je peux le récupérer sous sa forme brute. Mais si je colle le résultat du code HTML, la mise en forme est perdue, même sous forme brute.

Lorsque je colle le résultat dans Gmail ou Word et qu’ils conservent la mise en forme, ils doivent conserver le HTML. Discourse, en revanche, semble supprimer le HTML lorsque je colle le résultat du code HTML.

Est-il possible de ne pas le supprimer ?

Non. Vous pouvez consulter l’éditeur et voir le texte brut généré lorsque vous collez du contenu depuis Word. C’est tout ce qu’il y a, car la magie du collage du presse-papiers vers le format Markdown s’effectue dans le navigateur, entre le moment où vous collez et celui où vous voyez le résultat dans la fenêtre de l’éditeur.

3 « J'aime »

Voici le malentendu crucial : le contenu brut est du Markdown, pas du HTML.

Nous disposons d’une magie :sparkles: qui convertit le HTML en Markdown lorsque vous collez dans le compositeur.

4 « J'aime »

Et ce qui rend les choses encore plus confuses, c’est que le Markdown peut contenir du HTML. :man_shrugging:

3 « J'aime »

Mais cette conversion ne se produit pas (dans l’éditeur) si vous collez du code HTML réel. C’est ce que je pense avoir manqué plus tôt.

Ou peut-être, comme l’a dit @pfaffman, la conversion a lieu dans tous les cas, mais le Markdown peut conserver le HTML s’il est collé sous forme de code brut, mais pas si le résultat du code est collé.

D’accord, il doit avoir un type de contenu text/html dans votre presse-papiers pour fonctionner.

2 « J'aime »

D’autres formats, tels que le RTF (Rich Text Format), peuvent-ils également être conservés dans le Markdown comme le HTML ?

Le HTML n’est pas préservé en tant que tel dans le Markdown ; c’est simplement que certaines balises importantes sont prises en charge (par exemple, <em> emphasis), car nous essayons de suivre la loi de Postel tant que cela ne pose pas de problèmes.

Quel problème essayez-vous de résoudre ?

L’objectif est de comprendre comment fonctionne le processus (pertinent pour quelques projets). Cette conversation a déjà aidé à cet égard. Je me demande toujours si vous pouvez accéder au texte formaté à l’origine lorsque vous copiez depuis Microsoft Word.

Non. Vous devriez examiner le code JavaScript qui le traite lors du collage.

1 « J'aime »

Cela est dû à la gestion de la conversion « HTML vers Markdown », qui se produit lors du collage.

Voici le fichier source concerné. Vous remarquerez plusieurs éléments spécifiques à Microsoft Word (par exemple, MsoListParagraphCxSpFirst).

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

Pour vous assurer d’obtenir du texte brut, passez d’abord votre collage par le Bloc-notes ou un outil similaire.

2 « J'aime »

C’est très utile. Juste pour clarifier : pourquoi le passage par Notepad ferait-il une différence ?

Faire cela supprimerait tout le formatage Word et ne laisserait que du texte brut.

Cela se produit parce que lorsque vous « copiez » quelque chose, l’application présente en réalité plusieurs vues différentes des données aux applications dans lesquelles vous le collez. Discourse a choisi la version « élaborée » avec tout le formatage Word, tandis que le Bloc-notes optera pour la version « simple ». En le faisant passer par le Bloc-notes, vous ne laissez que la version « simple » pour que Discourse la voie.