¿Recuperar los datos "crudos" reales que crearon una publicación?

Si pego algo de HTML en un tema para crearlo, Discourse reformatea automáticamente el HTML (lo “cocina”), conservando parte (pero no todo) del formato subyacente y eliminando las etiquetas HTML de la vista.

¿Existe alguna forma de recuperar más tarde el HTML original que pegué en el tema al crearlo? Lo más cercano que he encontrado es hacer una llamada a la API con “raw=true” en el endpoint y ver la respuesta en response.data.post_stream.posts[0].raw, como se describe aquí.

Sin embargo, el texto “raw” que devuelve no es el HTML original. No estoy seguro de qué es exactamente; parece el tema cocinado básico con todos los espacios eliminados.

¿Existe alguna forma de recuperar ese HTML original que pegué?

3 Me gusta

Claro, hay una ruta para ver el contenido sin procesar de la publicación. Usa tu publicación como ejemplo. La URL es:

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

Para ver el contenido sin procesar, reemplaza /t/slug por /raw.

https://meta.discourse.org/raw/189183
7 Me gusta

Gracias, pero eso no parece funcionar para mí. Me gustaría recibir datos que mantengan el HTML exacto tal como lo pegué originalmente; por ejemplo, si el HTML original tenía una etiqueta div, quiero que los datos devueltos incluyan esa etiqueta div.

Lo que he encontrado en la respuesta “raw”, por ejemplo, tiene formato Markdown cuando los datos originales no lo tenían.

Voy a intentar preparar un ejemplo ahora para mostrar lo que quiero decir.

1 me gusta

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?

Así que aún no lo entiendo, o me estoy perdiendo un paso. Acabo de crear una publicación en try.discourse.org: https://try.discourse.org/t/testing-html-cooking/1405. El contenido sin procesar está en https://try.discourse.org/raw/1405. El contenido sin procesar definitivamente parece lo que dijiste que debería ser.

¿Podrías proporcionarme instrucciones paso a paso sobre cómo reproducir esto? Tomé el “HTML original” que compartiste anteriormente, agregué una etiqueta <html> y una etiqueta <head> en la parte superior para que fuera HTML válido, y creé una publicación con el HTML en el cuerpo.

1 me gusta

Tienes razón. El enlace sin procesar parece ser lo que quería decir. No estoy seguro de por qué no funcionó antes. Probaré algunas cosas y te responderé.

1 me gusta

Creo que el problema es que el HTML que deseas se convierte al pegar en el navegador, de modo que ese contenido nunca llega a raw.

Contenido de tu fragmento que puedes ver en raw

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

\u003cbody lang=EN-US style=‘tab-interval:.5in;word-wrap:break-word’\u003e
\u003c!–StartFragment–\u003e

\u003cp class=MsoNormal\u003eAquí hay algo de texto. Familia de fuente = Calibri, tamaño 12pt\u003co:p\u003e\u003c/o:p\u003e\u003c/p\u003e

\u003cp class=MsoNormal\u003e\u003co:p\u003e\u0026nbsp;\u003c/o:p\u003e\u003c/p\u003e

\u003cp class=MsoNormal\u003e\u003cb\u003eEste texto está en negrita\u003c/b\u003e.\u003co:p\u003e\u003c/o:p\u003e\u003c/p\u003e

Pero si copias el contenido desde Word y luego lo pegas, todo el HTML se convierte a markdown en el lado del cliente.

1 me gusta

Gracias a todos. Sí, @pfaffman, eso es al menos en parte lo que me genera confusión aquí.

Digamos que el objetivo es copiar desde Word y luego pegar en un tema de Discourse; y más tarde poder ver los datos “crudos” del tema y recuperar el formato original de Word.

¿Es eso posible?


EDITO: Quizás un ejemplo más claro (espero). Aquí hay algo de HTML:

<html>
<body>

<h1>Encabezado</h1>

<p style="font-size: 35pt">Este texto debería ser muy grande</p>

</body>
</html>

Si imprimo la salida (por ejemplo, en el editor de prueba de W3Schools aquí), produce dos líneas de texto, donde las palabras “Este texto debería ser muy grande” aparecen más grandes que la primera línea, lo cual es consistente con el estilo “font-size: 35pt”.

Si copio esa salida (no el código HTML, sino la salida) y luego la pego en la mayoría de los lugares, el formato se mantiene. Por ejemplo, si lo pego en Gmail el formato se conserva, y si lo pego en Microsoft Word el formato también se conserva; en ambos casos, la segunda línea es, correctamente, más grande que la primera.

Sin embargo, en Discourse, el formato se pierde incluso en la ventana del editor en modo crudo: se elimina todo el formato, excepto que se añade un “#” de markdown al h1.

Así que, si copio el código HTML real y lo pego en el editor, entonces el código HTML se preserva y puedo recuperarlo en su forma cruda. Pero, si pego el resultado del código HTML, el formato se pierde, incluso en la forma cruda.

Cuando pego la salida en Gmail o Word y estos mantienen el formato, deben estar conservando el HTML. Sin embargo, Discourse parece eliminar el HTML cuando pego la salida del HTML.

¿Es posible no eliminarlo?

No. Puedes revisar el editor y ver el texto sin formato que se genera al pegar desde Word. Eso es todo, ya que la magia de convertir el portapapeles a Markdown ocurre en el navegador, entre el momento en que pegas y cuando lo ves en la ventana del editor.

3 Me gusta

Aquí está el malentendido crucial: el raw es Markdown, no HTML.

Tenemos magia :sparkles: que convierte el HTML en Markdown cuando pegas en el compositor.

4 Me gusta

Y lo que lo hace más confuso es que el Markdown puede contener HTML. :man_shrugging:

3 Me gusta

Pero esta conversión no ocurre (en el editor) si pegas código HTML real. Creo que eso fue lo que me perdí antes.

O quizás, como dijo @pfaffman, la conversión ocurre de todos modos, pero el Markdown puede conservar el HTML si se pega como código directo, pero no si se pega la salida del código.

Correcto, debe tener un tipo de contenido text/html en tu portapapeles para que funcione.

2 Me gusta

¿Se pueden preservar otros formatos, como RTF (formato de texto enriquecido), en el markdown igual que el HTML?

El HTML no se preserva en sí mismo en el Markdown; simplemente se admiten algunas etiquetas importantes (por ejemplo, \u003cem\u003e énfasis) ya que intentamos seguir la Ley de Postel siempre que no cause problemas.

¿Qué problema estás tratando de resolver?

El objetivo es comprender cómo funciona el proceso (relevante para algunos proyectos). Esta conversación ya ha ayudado con eso. Todavía me pregunto si puedes tener acceso al texto con el formato original al copiar desde Microsoft Word.

No. Tendrías que revisar el código de JavaScript que lo procesa al pegar.

1 me gusta

Esto se debe al manejo de “HTML a Markdown”, que ocurre al pegar.

Aquí tienes el archivo fuente relevante. Notarás varios elementos específicos de Microsoft Word (por ejemplo, MsoListParagraphCxSpFirst).

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

Para asegurarte de obtener texto sin formato, pasa tu pegado por el Bloc de notas o similar primero.

2 Me gusta

Esto es muy útil. Solo para aclarar: ¿por qué pasar por Notepad marcaría la diferencia?

Hacer eso eliminaría todo el formato de Word y solo te dejaría texto sin formato.

Esto ocurre porque, cuando “copias” algo, la aplicación presenta múltiples vistas diferentes de los datos a las aplicaciones en las que lo pegas. Discourse ha optado por la versión “compleja” con todo el formato de Word, mientras que el Bloc de notas elegirá la versión “sin formato”. Al pasarlo por el Bloc de notas, solo dejas la versión “sin formato” para que Discourse la vea.