Aller au contenu

Référence

phil/markup

Types

TypeNatureRôle
MarkupFormatenumMarkdown, Html, BBCode, MediaWiki, DokuWiki, Creole, Text, Ujo ; values() ; nameOf(), le nom d'un cas ou d'un format qu'apporte un module complémentaire
LevelenumBasic, Forum, All
MarkupCompilerinterfacecompile(string $source, MarkupFormat|string $format): string, du HTML qu'on ne peut pas afficher sans risque ; une chaîne nomme un format d'un module complémentaire
LevelAwareCompilerinterfaceUn MarkupCompiler avec compileFor($source, $format, $level) : on lui indique le niveau auquel le HTML sera assaini
HtmlPurifierinterfacepurify(string $html, Level $level): string
Exception\MarkupException, Exception\InvalidSource, Exception\UnknownFormatexceptionsVoir Exceptions
Markupfinal readonly classtoHtml() et text() : compiler (au niveau voulu, pour un LevelAwareCompiler), puis assainir ; Level::All sauf indication contraire
MarkedUpTextobjet intégrablesource (texte), format (le nom du format, 16 caractères), html (texte)
Lexer\Cursorfinal classLe curseur de l'analyseur : voir L'analyseur
Lexer\Sluggerfinal classLes ancres d'un document, uniques
Reader\MarkupReaderinterfaceread(string $source): Reading
Reader\Readingfinal readonly classdocument, un Document UJO, metadata et losses
Reader\Loss, Reader\LossReasonfinal readonly class, enumCe qu'un lecteur n'a pas gardé : élément, chemin, raison
Contract\ExtractedElementStoreinterfacestore(string $content, string $mediaType, string $name): ?string : où les éléments extraits sont stockés sous forme de fichiers
Reader\Markdown\MarkdownReaderMarkupReaderLe Markdown, et la syntaxe d'un dialecte : voir Markdown
Reader\Markdown\Contract\MarkdownDialect, Reader\Markdown\BaseDialectinterface, abstract classUn dialecte de Markdown, et un dialecte qui se lit comme du Markdown simple, à étendre : voir Points d'extension
Reader\Markdown\Contract\BlockRule, Reader\Markdown\Rule\InlineRuleinterfacesUne règle de bloc et une règle en ligne d'un dialecte
Reader\Markdown\MarkdownSyntaxenumLa syntaxe intégrée qu'un dialecte peut désactiver : ColonBlocks
Reader\Markdown\Context, InlineParser, Inline, Delimiter, Attributes, Curly, FrontMatter, Rule\DelimiterRuleclassesCe avec quoi les règles d'un dialecte lisent, et ce qu'elles produisent : voir Points d'extension
Reader\Contract\ReaderProviderinterfacereader(Level $level, Normalizer $normalizer): MarkupReader, le lecteur d'un format qu'apporte un module complémentaire
Reader\BBCode\BBCodeReaderMarkupReaderLe BBCode et ses extensions : voir BBCode
Reader\MediaWiki\MediaWikiReader, Reader\DokuWiki\DokuWikiReader, Reader\Creole\CreoleReaderMarkupReaderLes wikis et leurs extensions : voir Les wikis
Reader\Wiki\WikiLinksfinal readonly classOù se trouvent les pages et les médias que nomme un texte de wiki : pages, media
Reader\Html\HtmlReaderMarkupReaderHTML vers UJO : voir HTML
Reader\UjoReaderMarkupReaderLe JSON UJO, par phil/ujo
Reader\Text\TextReaderMarkupReaderLe texte brut : un paragraph pour chaque suite de lignes, sauts de ligne gardés, adresses changées en liens
Adapter\DefaultCompilerLevelAwareCompilerChaque format, ceux des modules complémentaires donnés par nom ; reader($format, $level) donne le lecteur d'un format vers UJO, y compris ceux du HTML et du texte brut, même si les deux se compilent sans lui ; formats(), le nom de chacun
Adapter\SanitizerPurifierHtmlPurifierdefaultPolicies(), un assainisseur par niveau
Adapter\CodeClassesfinal readonly classLes classes gardées sur code (language-…) et span (hl-…), un assainisseur d'attributs de symfony/html-sanitizer
Adapter\PlainText, Adapter\AutolinkcompilateursLe texte brut, les liens dans le texte

L'espace de noms racine (formats, niveaux, ports et exceptions) est ce qu'un modèle de domaine peut nommer ; l'analyseur, les lecteurs, les adaptateurs, Markup et MarkedUpText relèvent de l'infrastructure. Les classes de Reader\Markdown et les règles sous Reader\Markdown\Rule que le tableau ne nomme pas, les classes de Reader\BBCode autres que BBCodeReader, celles de Reader\Wiki autres que WikiLinks, les syntaxes des wikis et le parcoureur de Reader\Html sont internes.

Formats

FormatCompilé
markdownlu en UJO par MarkdownReader, puis rendu par phil/ujo ; HTML brut gardé à all, échappé en dessous
ujolu et vérifié par phil/ujo, puis rendu ; une source invalide lance InvalidSource
htmltel qu'écrit ; HtmlReader le convertit en UJO sur demande : voir HTML
bbcodelu en UJO par BBCodeReader, puis rendu ; HTML brut comme pour le Markdown : voir BBCode
mediawiki, dokuwiki, creolelus en UJO par MediaWikiReader, DokuWikiReader, CreoleReader, puis rendus ; HTML brut comme pour le Markdown : voir Les wikis
textéchappé ; un paragraphe par bloc séparé par une ligne vide, un saut de ligne pour chaque autre nouvelle ligne, adresses changées en liens ; TextReader le convertit en paragraphes UJO sur demande
un format d'un module complémentairelu en UJO par le lecteur que donne son ReaderProvider, puis rendu

Le HTML que produit phil/ujo porte les classes de ses blocs (ujo-paragraph, ujo-header) et les identifiants des titres. L'assainisseur de chaque niveau retire les classes, sauf celles du code (Adapter\CodeClasses) : language-… sur code, qui nomme le langage d'un bloc pour un surligneur dans le navigateur, et hl-… sur span, qu'écrit un surligneur côté serveur, là où les span sont gardés ; all garde les identifiants, vers lesquels pointe une table des matières. Formats liste, fonctionnalité par fonctionnalité, comment chaque format l'écrit.

Niveaux

NiveauGardePour
basicstrong, b, em, i, u, s, del, sub, sup, code, brun nom, une légende, un court commentaire
forumbasic, avec p, a, img, ul, ol, li, blockquote, cite, pre, hrun message de forum
allchaque élément que symfony/html-sanitizer considère comme sûr, titres et tableaux comprisun article qu'écrit un rédacteur

Un conteneur qu'un niveau ne permet pas (un paragraphe, une liste, un titre, un tableau) est retiré et son texte gardé ; tout autre élément (un script, un cadre, un formulaire, un objet) est retiré avec son contenu. Chaque niveau retire les attributs qu'il ne connaît pas, dont les styles et les gestionnaires d'événements. Les liens peuvent utiliser http, https et mailto, ou être relatifs ; les images http et https, ou être relatives. La longueur de l'entrée n'est pas plafonnée.

Une image est une requête à son hôte. À forum et all, une image d'un autre site ([img]https://…[/img], ![](https://…), <img src="https://…">) fait appeler ce site par le navigateur de chaque lecteur ; le site apprend leur adresse et le moment où ils lisent. C'est un pistage sans leur consentement quand un membre a écrit l'image, ce que la Loi 25 et le RGPD interdisent sans consentement. SanitizerPurifier::defaultPolicies() prend les hôtes d'où peuvent venir les images :

SanitizerPurifier::defaultPolicies(['cdn.example.com']);   // that host and its subdomains, and the site's own images
SanitizerPurifier::defaultPolicies([]);                    // the site's own images only
SanitizerPurifier::defaultPolicies();                      // any host

Une image d'un autre hôte perd son src ; une image relative, servie par le site lui-même, est toujours gardée. Un site dont les membres écrivent des textes à forum donne les hôtes depuis lesquels il sert des images, ou [].

Assainissez de nouveau ce qui a été stocké au moment de l'afficher : une politique resserrée s'applique alors aux textes écrits avant.