Comentarios HTML multilínea no ocultos en publicación de wp-discourse

Hola,

No estoy seguro de si esto es un problema específico de wp-discourse o del analizador HTML de Discourse, pero parece que los comentarios HTML multilínea no se ocultan en las publicaciones generadas por wp-discourse.

Acabo de terminar de configurar chinwag.pluralistic.net, basado en las publicaciones de pluralistic.net de Cory Doctorow. Sus publicaciones incluyen algunos metadatos al principio en forma de comentarios HTML. Recientemente, este formato cambió de una sola línea a múltiples líneas.

Puedes verlo en esta publicación:

El comentario de una sola línea del artículo original se elimina:

Sin embargo, el comentario multilínea de una publicación posterior se muestra directamente:

No creo que el problema sea causado por el plugin de WordPress. Aquí hay un ejemplo de marcado que Discourse no interpreta como un comentario:

<p><!--
Tags:


Summary:
New podcast; Europe's interop coalition; Scarfolk beermats; Miami cop owns illegal mansion nightclub; Video and transcript of my OII talk; Shower temperature vs handle position

URL:
https://pluralistic.net/2020/07/06/polbathic/

Title:
Pluralistic: 06 Jul 2020 polbathic

Bullet:
🧔🏿

Separator:
_,.-'~'-.,__,.-'~'-.,__,.-'~'-.,__,.-'~'-.,__,.-'~'-.,_

Top Sources:
Today's top sources: Fipi Lele, Naked Capitalism (https://www.nakedcapitalism.com/).

-->
<br>
</p>

Se renderiza como:

El problema es que las líneas vacías dentro del comentario son interpretadas como párrafos por Discourse. Cuando esto ocurre, el comentario HTML ya no es un marcado válido. Si se eliminan las líneas vacías dentro del comentario, será interpretado correctamente por Discourse:

<p><!--
Tags:
Summary:
New podcast; Europe's interop coalition; Scarfolk beermats; Miami cop owns illegal mansion nightclub; Video and transcript of my OII talk; Shower temperature vs handle position
URL:
https://pluralistic.net/2020/07/06/polbathic/
Title:
Pluralistic: 06 Jul 2020 polbathic
Bullet:
🧔🏿
Separator:
_,.-'~'-.,__,.-'~'-.,__,.-'~'-.,__,.-'~'-.,__,.-'~'-.,_
Top Sources:
Today's top sources: Fipi Lele, Naked Capitalism (https://www.nakedcapitalism.com/).
-->
<br>
</p>

Aparte de editar el contenido del post antes de publicarlos en Discourse, no estoy seguro de cuál sería el mejor enfoque para abordar esto.

Probablemente la mejor manera de abordar esto sería eliminar los comentarios del post antes de publicarlo en Discourse. Quizás el plugin debería hacer esto de forma predeterminada, pero esta es la primera vez que me encuentro con este problema.

El plugin WP Discourse tiene un filtro al que se puede conectar para analizar el contenido del post antes de publicarlo en Discourse. El filtro se llama wp_discourse_excerpt. El contenido del post se le pasa como una variable. Así es como se puede usar ese filtro para eliminar todos los comentarios del post de WordPress antes de que se publique en Discourse. Este patrón también se podría usar para modificar el post de otras maneras:

add_filter( 'wp_discourse_excerpt', 'wpdc_custom_discourse_excerpt' );
function wpdc_custom_discourse_excerpt( $html ) {
	if ( ! extension_loaded( 'libxml' ) ) {

		return $html;
	}

	$use_internal_errors   = libxml_use_internal_errors( true );
	$disable_entity_loader = libxml_disable_entity_loader( true );
	$html_doc              = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/></head><body>' . $html . '</body></html>';
	$doc                   = new \DOMDocument( '1.0', 'utf-8' );
	$doc->loadHTML( $html_doc );
	$finder   = new \DOMXPath( $doc );
	$comments = $finder->query( '//comment()' );
	if ( $comments->length ) {
		foreach ( $comments as $comment ) {
			$comment->parentNode->removeChild( $comment );
		}

		$parsed = $doc->saveHTML( $doc->documentElement );
		libxml_clear_errors();
		libxml_use_internal_errors( $use_internal_errors );
		libxml_disable_entity_loader( $disable_entity_loader );

		return preg_replace( '~<(?:!DOCTYPE|/?(?:html|head|meta|body))[^>]*>\s*~i', '', $parsed );
	}

	libxml_clear_errors();
	libxml_use_internal_errors( $use_internal_errors );
	libxml_disable_entity_loader( $disable_entity_loader );

	return $html;
}
```\n
Agregar ese código al archivo `functions.php` de tu tema de WordPress debería solucionar el problema. Si no te funciona, verifica que la extensión `libxml` esté habilitada en el servidor de tu sitio de WordPress.

De hecho, lo probaré, pero suena a un problema mayor si las entidades HTML en un comentario hacen que Discourse decida que ese comentario ahora es HTML inválido, ¿no?

No estoy seguro de cómo debería manejar Discourse esto. Creo que para las publicaciones creadas directamente en Discourse tiene sentido decir que solo se admite un subconjunto limitado de HTML, pero para las publicaciones creadas a través de la API o importadas desde un feed RSS no me queda claro hasta qué punto debería llegar Discourse para soportar HTML.

Creo que tendría sentido agregar el código que publiqué anteriormente directamente al plugin WP Discourse. El plugin ya utiliza funcionalidad similar para limpiar los comentarios que se importan a WordPress desde Discourse. Esto ha estado en uso durante algún tiempo sin que se hayan reportado problemas. Te responderé sobre esto en los próximos días.

Esto se ha agregado en WP Discourse versión 2.0.6. Cuando se publica el contenido completo de la publicación desde WordPress a Discourse, se eliminan todos los bloques de comentarios de la publicación antes de enviarla a Discourse.

¡Gracias, Simon! Lo instalaré en cuanto esté disponible y te informaré.

ETA: Funciona a la perfección. ¡Gracias!