Recuperar os dados "brutos" reais que criaram uma postagem?

Se eu colar algum HTML em um tópico para criá-lo, o Discourse reformatará automaticamente o HTML (ele o “cozinha”), mantendo parte (mas não toda) a formatação subjacente e removendo as tags HTML da visualização.

Existe alguma maneira de recuperar posteriormente o HTML original que eu colei no tópico ao criá-lo? O mais próximo que consigo encontrar é fazer uma chamada à API com “raw=true” no endpoint e ver a resposta em response.data.post_stream.posts[0].raw, como descrito aqui.

No entanto, o texto “raw” retornado não é o HTML original. Não tenho certeza do que seja exatamente — parece ser o tópico cozido básico com todos os espaços removidos.

Existe alguma maneira de recuperar esse HTML original que eu colei?

3 curtidas

Claro, existe uma rota para visualizar o conteúdo bruto da postagem. Use sua postagem como exemplo. A URL é

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

Para ver o conteúdo bruto, substitua /t/slug por /raw.

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

Obrigado, mas isso não parece estar funcionando para mim. Gostaria de receber dados que mantenham o HTML exato como quando o original foi colado — então, se o HTML original tinha uma tag div, por exemplo, quero que os dados retornados incluam essa tag div.

O que encontrei na resposta “raw”, por exemplo, contém formatação Markdown quando os dados originais não tinham nenhuma.

Vou tentar montar um exemplo agora para mostrar o que quero dizer.

1 curtida

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?

Então, ainda não estou entendendo ou estou perdendo algum passo. Acabei de criar uma postagem em try.discourse.org: https://try.discourse.org/t/testing-html-cooking/1405. O conteúdo bruto está em https://try.discourse.org/raw/1405. O conteúdo bruto realmente parece com o que você disse que deveria ser.

Você pode me fornecer instruções passo a passo de como reproduzir isso? Peguei o “HTML Original” que você compartilhou acima, adicionei as tags <html> e <head> no topo para que fosse um HTML válido e criei uma postagem com o HTML no corpo.

1 curtida

Você tem razão. O link bruto realmente parece o que eu quero. Não tenho certeza do motivo de isso não ter funcionado antes. Vou testar algumas coisas e responder.

1 curtida

Acho que o problema é que o HTML que você deseja é convertido ao colar no navegador, de modo que esse conteúdo nunca chega ao raw.

Conteúdo do seu fragmento que você pode ver no raw

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

Aqui está algum texto. Família da fonte = Calibri, tamanho 12pt

 

Este texto está em negrito.

Mas se você copiar o conteúdo do Word e depois colar, todo o HTML será convertido em markdown no front-end.

1 curtida

Obrigado, pessoal. Sim, @pfaffman, isso é, pelo menos em parte, o que está causando parte da minha confusão aqui.

Digamos que o objetivo seja copiar do Word e depois colar em um tópico do Discourse; e, mais tarde, ser capaz de visualizar os dados “cruos” do tópico e recuperar a formatação original do Word.

Isso é possível?


EDIT: Aqui está talvez um exemplo mais claro (espero). Aqui está algum HTML:

<html>
<body>

<h1>Título</h1>

<p style="font-size: 35pt">Este texto deve ser muito grande</p>

</body>
</html>

Se eu imprimir a saída (por exemplo, no editor “try it” do W3Schools aqui), ele produz duas linhas de texto, com as palavras “Este texto deve ser muito grande” aparecendo maiores que a primeira linha — consistente com o estilo “font-size: 35pt”.

Se eu copiar essa saída (não o código HTML, mas a saída) e depois colar na maioria dos lugares, a formatação é mantida. Por exemplo, se eu colar no Gmail, a formatação é mantida, e se eu colar no Microsoft Word, a formatação também é mantida — em ambos os casos, a segunda linha está, corretamente, maior que a primeira.

No Discourse, no entanto, a formatação é perdida mesmo na janela do editor bruto: toda a formatação é removida, exceto que um “#” de markdown é adicionado ao h1.

Então, se eu copiar o código HTML real e colá-lo no editor, de fato o código HTML é preservado e posso recuperá-lo em sua forma bruta. Mas, se eu colar o resultado do código HTML, a formatação é perdida, mesmo na forma bruta.

Quando colo a saída no Gmail ou no Word e eles mantêm a formatação, devem estar preservando o HTML. O Discourse, no entanto, parece remover o HTML quando colo a saída do HTML.

É possível não removê-lo?

Não. Você pode verificar no editor e ver o texto bruto que é gerado ao colar do Word. É só isso, pois a mágica de converter o conteúdo da área de transferência para Markdown acontece no navegador entre o momento em que você cola e o momento em que o vê na janela do editor.

3 curtidas

Aqui está o mal-entendido crucial: o raw é Markdown, não HTML.

Temos magia :sparkles: que converte HTML em Markdown quando você cola no compositor.

4 curtidas

E o que torna tudo mais confuso é que o Markdown pode conter HTML. :man_shrugging:

3 curtidas

Mas essa conversão não ocorre (no editor) se você colar o código HTML real. É isso que acho que perdi anteriormente.

Ou talvez, como @pfaffman disse, a conversão realmente ocorra independentemente do que for colado, mas o Markdown pode manter o HTML se colado como código puro, mas não se for colado a saída do código.

Certo, o conteúdo na sua área de transferência precisa ter o tipo text/html para funcionar.

2 curtidas

Outros formatos, como RTF (Rich Text Format), também podem ser preservados no Markdown como o HTML?

O HTML não é preservado em si no markdown; apenas algumas das tags importantes são suportadas (por exemplo, <em> ênfase </em>), pois tentamos seguir a Lei de Postel sempre que isso não causa problemas.

Que problema você está tentando resolver?

O objetivo é entender como o processo funciona (relevante para alguns projetos). Essa conversa já ajudou nisso. Ainda estou me perguntando se é possível acessar o texto originalmente formatado ao copiar do Microsoft Word.

Não. Você precisaria examinar o código JavaScript que processa isso ao colar.

1 curtida

Isso ocorre devido ao tratamento de “HTML para Markdown”, que acontece ao colar.

Aqui está o arquivo de origem relevante. Você notará várias partes de tratamento específico do Microsoft Word (por exemplo, MsoListParagraphCxSpFirst).

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

Para garantir que você obtenha texto puro, passe sua colagem pelo Bloco de Notas ou similar primeiro.

2 curtidas

Isso é muito útil. Só para esclarecer: por que passar pelo Bloco de Notas faria diferença?

Fazer isso removeria toda a formatação do Word e deixaria apenas texto simples.

Isso está acontecendo porque, quando você “copia” algo, o aplicativo na verdade apresenta várias visualizações diferentes dos dados para os aplicativos nos quais você cola. O Discourse optou pela versão “rica”, com toda a formatação do Word, enquanto o Bloco de Notas optará pela versão “simples”. Ao passar pelo Bloco de Notas, você deixa apenas a versão “simples” para que o Discourse a veja.