Plugin Wordpress e html-como-texto (especialmente para e-mail)

Temos o plugin do Wordpress configurado para postar tópicos completos em uma categoria de anúncios em nosso fórum. Isso funciona muito bem, mas as mensagens de e-mail que o Discourse envia são marcadas como Content-Type: text/plain; charset=UTF-8.

Pelo que entendi, isso é Tecnicamente Verdadeiro, pois o formato esperado é markdown, que é uma espécie de texto simples. Mas, é claro, markdown também, para o bem ou para o mal, inclui “html também é válido, yolo!”.

E, de fato, as postagens vindas do Wordpress são um monte de HTML.

Como outras pessoas estão lidando com isso? Existe alguma maneira de fazer com que as postagens enviadas para o Discourse sejam um markdown razoável como texto humano, afinal? Ou existe alguma maneira de forçar o tipo de conteúdo HTML para o e-mail gerado nesta categoria? Ou… alguma outra ideia? Obrigado!

Só para esclarecer, @mattdm, quando você diz

Por “mensagens”, você quer dizer as notificações por e-mail que você recebe do Discourse sobre novas postagens na sua categoria de anúncios?

Estou apenas tentando entender o ponto de dor específico do usuário que você está tentando abordar aqui.

Sim, desculpe. Por “mensagens” eu quis dizer “mensagens de e-mail”. E por “isso” eu quis dizer Discourse, não o plugin do Wordpress. Vou editar a postagem principal para deixar isso claro.

Na minha imaginação, a coisa mais legal seria as mensagens de e-mail serem multipartes com um text/plain renderizado em markdown limpo e um text/html separado. Mas eu nem tenho certeza de como isso funcionaria.

Desculpe, apenas para esclarecer novamente, você está levantando isso porque as notificações por e-mail de postagens do Discourse contendo HTML (por exemplo, postagens vinculadas a postagens do Wordpress em sua categoria de anúncios) contêm incorretamente entidades HTML? Se sim, você poderia compartilhar um exemplo?

O motivo pelo qual estou insistindo nisso é que a geração de notificações por e-mail no Discourse é bastante separada de qualquer coisa relacionada ao plugin do Wordpress. As notificações por e-mail têm seu próprio pipeline e existem várias maneiras de você acabar com entidades HTML em uma postagem do Discourse, sendo uma postagem do Wordpress apenas uma delas.

Em outras palavras, o fato de haver HTML em uma postagem do Discourse é um problema diferente do que as notificações por e-mail sobre essa postagem contêm e como elas são codificadas. Entender o problema específico que você está tendo / levantando ajudará a direcionar os olhos e a atenção corretos para ele.

Talvez eu esteja entendendo mal o que está acontecendo, mas aqui está o que acho que está acontecendo:

  1. A postagem do WordPress é publicada.
  2. O plugin responde a isso e cria uma postagem no Discourse.
  3. As postagens do Discourse são todas em Markdown, mas acontece que a postagem vinda do WordPress através do plugin é uma bagunça de HTML (o que é perfeitamente válido em Markdown).
  4. Usuários inscritos em notificações por e-mail recebem um e-mail contendo esse texto — que parece uma bagunça de HTML.

Percebo que alguém poderia criar manualmente uma postagem no Discourse com um monte de HTML da mesma forma, mas na prática isso geralmente não é um problema (e se fosse, poderia ser resolvido na maioria das vezes com um educado “ei, você poderia não fazer isso?”).

Espero que isso faça sentido.

Um exemplo: esta postagem

Parece com isto, tanto no Discourse se você editar a postagem quanto quando enviada:

<small>Publicado originalmente em:		https://communityblog.fedoraproject.org/cpe-hiring-a-software-engineer/
		</small><br><p>O grupo Community Platform Engineering, ou CPE para abreviar, é a equipe da Red Hat que combina engenharia de TI e de lançamento para Fedora e CentOS. Atualmente, temos uma vaga aberta para um <a href="https://global-redhat.icims.com/jobs/96157/software-engineer/job?mobile=true&amp;width=412&amp;height=732&amp;bga=true&amp;needsRedirect=false&amp;jan1offset=-480&amp;jun1offset=-420">engenheiro de software na Índia</a>.</p>
<h2>Sobre a função</h2>
<p>Estamos <a href="https://global-redhat.icims.com/jobs/96157/software-engineer/job?mobile=true&amp;width=412&amp;height=732&amp;bga=true&amp;needsRedirect=false&amp;jan1offset=-480&amp;jun1offset=-420">contratando novos talentos</a> para trabalhar em tempo integral no Fedora, principalmente como parte de nosso grupo de Engenharia de Lançamento. Você trabalhará na infraestrutura que constrói e envia os artefatos e atualizações de lançamento do Fedora Linux. Esta função é perfeita para qualquer pessoa com experiência ou interesse em Engenharia de Lançamento.</p>
<h2>Sobre o CPE</h2>
<p>Nosso objetivo é manter os servidores e serviços principais em funcionamento e mantidos, construir lançamentos e realizar outras tarefas estratégicas que exigem mais tempo dedicado do que os voluntários podem oferecer.</p>
<p>Veja <a href="https://docs.fedoraproject.org/en-US/cpe/">nossos docs</a> para mais informações. Estamos ansiosos para conhecê-lo e, esperançosamente, trabalhar com você em breve!</p>

… o que não é muito útil.

Ok, vou responder às questões que você está levantando aqui separadamente. Entendo por que você as está conectando, mas espero que você veja por que são problemas separados.

Entidades HTML em notificações de e-mail em texto puro

a coisa mais legal seria se as mensagens de e-mail fossem multipartidas, com uma versão em markdown renderizada em texto limpo (text/plain) e uma versão separada em text/html

Na verdade, é assim que as notificações de e-mail do Discourse funcionam atualmente. Se você olhar o “original” de uma notificação de e-mail do Discourse, verá que há uma versão em texto e uma versão em HTML.

Parece que você está dizendo, mas ainda não tenho 100% de certeza disso, que você está recebendo entidades HTML na versão em texto puro das notificações de e-mail do Discourse, o que resulta em você ver as próprias entidades HTML no corpo do e-mail ao visualizá-lo em um cliente de e-mail que não suporta HTML. É isso que você está dizendo? Você poderia compartilhar uma captura de tela disso de um cliente de e-mail (que não suporta HTML)?

Se for esse o caso, este é um problema específico da geração e formatação do conteúdo dos e-mails do Discourse, e seria melhor separá-lo em um tópico mais direcionado em #suporte ou #contribuir:bug.

HTML nas publicações do Discourse

Você está levantando uma questão relevante aqui, mas, do ponto de vista técnico, a questão reside em como o Discourse aborda o conteúdo importado de forma mais ampla. O padrão atual para conteúdo importado é HTML, não markdown.

Outros contextos nos quais você pode ver isso são o plugin RSS Polling, que, assim como o plugin WP Discourse, importa HTML para o conteúdo da publicação. Observe também que a configuração do site embed support markdown está desativada por padrão, assim como todas as outras configurações do site que lidam com HTML incorporado nas publicações (por exemplo, allowed embed selectors).

Estou chutando em parte aqui, mas a razão mais provável para essa decisão estratégica ter sido tomada nos primeiros dias do Discourse lidando com conteúdo importado foi uma combinação de simplicidade e fidelidade, ou seja, as conversões de HTML para markdown serão imperfeitas. Há uma exceção importante a isso, que mencionarei abaixo.

O plugin WP Discourse poderia tentar converter o HTML das publicações do WordPress para markdown antes de enviá-las ao Discourse. Sim, existem bibliotecas PHP existentes que convertem HTML para markdown, mas nunca é tão simples assim ao converter uma linguagem de marcação, especialmente considerando os diferentes sabores de markdown.

De fato, a tentativa do plugin WP Discourse de lidar com a conversão seria realmente equivocada, considerando que já existe um conversor personalizado HtmlToMarkdown no Discourse. Atualmente, este conversor lida com a conversão de HTML para markdown em e-mails importados para o Discourse. Se o HTML das publicações do WordPress fosse convertido para markdown do Discourse, isso precisaria ser tratado por esse conversor.

Atualmente, o plugin WP Discourse usa a API do Discourse para publicar publicações, ou seja, o endpoint /posts. Então, essencialmente, o que você está dizendo é que deseja que o suporte ao conversor HtmlToMarkdown seja adicionado ao endpoint /posts do Discourse (ou seja, como um parâmetro de consulta opcional). Você poderia defender isso e, se implementado, o plugin WP Discourse o adotaria como uma configuração opcional.