Le mode « sans HTML » de PHP Markdown

On m’a souvent contacté en me demandant comment désactiver le HTML dans PHP Markdown. Jusqu’à il y a quelque mois, j’était opposé à offrir cette possibilité parce que le HTML fait tout simplement parti de la syntaxe Markdown. Après tout, Markdown a été conçu pour que lorsqu’il n’y a pas d’élément de la syntax qui fait ce que vous voulez, ou si vous ne connaissez tout simplement pas la syntaxe, vous n’avez qu’à l’écrire en HTML.

Enlever le support pour le HTML dans ce contexte voudrait dire plus de pression pour implanter une syntaxe spécifique à Markdown alors que Markdown (avec HTML) n’en a pas vraiment besoin. Ça force aussi les utilisateurs qui ne sont pas familier avec la syntaxe à l’apprendre puisqu’ils ne peuvent plus écrire en HTML. La meilleur option, à mes yeux, est de simplement restreindre l’usage des balises et attributs HTML à ce qu’on désire permettre.

À force de répondre à des questions, je me suis aperçu que beaucoup n’était pas vraiment intéressés par mes arguments. Et la réponse au problème technique n’était pas toute simple : à moins de sacrifier les blocs et les étendues de code, ainsi que les liens automatiques, il n’est pas possible de simplement échapper à l’avance les caractères plus petit que < utilisés pour l’ouverture des tags.

En gros, plusieurs ont implanté ça incorrectement sans même s’en rendre compte (parce qu’ils n’utilisent pas beaucoup les étendues et les blocs de code ou les liens automatiques). J’ai réalisé que c’était probablement plus problématique pour les utilisateurs qui apprennent Markdown que le manque de HTML. J’ai donc changé mon attitude par rapport au problème et décider d’aider ceux qui veulent désactiver le HTML complètement.

Si vous voulez désactiver le HTML dans PHP Markdown, ne modifiez pas le code !

PHP Markdown a dans sa dernière version un réglage (caché) qui fait exactement ça. Vous n’avez qu’à instancier le parseur et vous-même et à changer la propriété no_markup comme ceci :

$parser = new Markdown_Parser; // or MarkdownExtra_Parser
$parser->no_markup = true;
$html = $parser->transform($text);

Il y a aussi une propriété no_entities que vous pouvez mettre à true pour désactiver les entités de caractère.

Notez qu’en interdisant les balises HTML vous refusez aux utilisateurs de votre script, CMS, ou application web la seule alternative pour créer des éléments que Markdown ne fourni pas, tel que <sup> et <sub>, <ins> et <del>, <q>, <bdo>, <abbr>, <object> (nécessaire pour insérer des vidéos), et plusieurs autres. Une meilleure alternative serait de simplement filter la sortie HTML en utilisant quelque chose comme kses, mais je vous laisse juger par vous même de ce qui convient le mieux à vous et à vos utilisateurs.

Avec le pouvoir viens des responsabilités : s’il vous plait assurez-vous d’offrir à vos vos utilisateurs la meilleure expérience possible avec Markdown. Merci.


Commentaires

Rémi Prévost

La méthode que j’utilise pour mon blogue, personnellement, est celle-ci : Je passe un htmlspecialchars sur le texte et ensuite:

$str = str_replace("&lt;http://","<http://",$str);
$str = str_replace("&gt;",">",$str);
$str = str_replace("&quot;","\",$str)
Rémi Prévost

Oups, mon commentaire s’est fait escapé! Certains blocs de texte ne sont pas corrects, et je ne peux les reproduire ici, les caractères `&` se font *escaper*

Michel Fortin

Voilà Rémi, ton commentaire est réparé.

Je te ferais remarquer que ton code ne fonctionnent que pour les liens automatiques commençants par http://. Les autres, incluant les addresses https, ftp ainsi que les adresses de courriel, ne passerait pas au travers de ton filtre.

Tout de même bravo pour avoir pensé aux balises qui n’ont pas d’équivalent Markdown.

Benoit

Salut! Merci pour markdown! SUper utile et simple d’utilisation! Merci également pour la solution kses! Trés trés intéressante lib! Salut bonne continuation