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?

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

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.

Ok. Aqui está minha tentativa de um exemplo:

Escrevi algumas linhas com formatação diferente em um processador de texto, e o HTML gerado foi:


HTML Original:

<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>Aqui está um texto. Família de fonte = Calibri, tamanho 12pt<o:p></o:p></p>

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

    <p class=MsoNormal><b>Este texto está em negrito</b>.<o:p></o:p></p>

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

    <p class=MsoNormal><i>Este texto está em itálico</i>.<o:p></o:p></p>

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

    <p class=MsoNormal><span style='font-size:18.0pt'>Este texto está em uma fonte maior
    = Calibri, tamanho 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'>E aqui está mais um texto aleatório
    centralizado = Garamond, tamanho 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>

Post do Discourse Processado:

Se eu colar este HTML em um post do Discourse, ele fica assim (após passar pelo processo de “cook”):

Aqui está algum texto. Família de fontes = Calibri, tamanho 12pt

 

Este texto está em negrito.

 

Este texto está em itálico.

 

Este texto está em uma fonte maior = Calibri, tamanho 18.

 

E aqui está mais algum texto aleatório que está centralizado = Garamond, tamanho 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 que estou tentando recuperar

Não há problema em que o Discourse processe a publicação e a exiba como faz. Mas o que quero agora é poder, posteriormente, pegar uma publicação e recuperar o HTML original subjacente. Portanto, os dados que eu recupero devem ter esta aparência:

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

<p class=MsoNormal>Aqui está algum texto. Família de fonte = Calibri, tamanho 12pt<o:p></o:p></p>

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

<p class=MsoNormal><b>Este texto está em negrito</b>.<o:p></o:p></p>

(etc.)

No momento, se eu usar o endpoint “raw” que você forneceu, ele não fornece esse HTML. Em vez disso, ele apenas fornece o texto com, aparentemente, a maioria da formatação e espaçamento removidos.

É possível recuperar o HTML original subjacente?

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.

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.

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.

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.

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.

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

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.

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.

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.

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.