css-sanitizer/cs
Appearance
Knihovna CSS Sanitizer implementuje v PHP tokenizér, parser a gramatický matcher CSS, který se většinou řídí gramatikou CSS Syntax Module Level 3 ze dne 20. února 2014, CSS Values and Units Module Level 3 a CSS Selectors Level 3.
Také poskytuje sanitizér (StylePropertySanitizer), který rozpoznává různé CSS3 moduly.
Tato knihovna byla vyvinuta pro použití v Extension:TemplateStyles pro MediaWiki.
Použití
.php
use Wikimedia\CSS\Parser\Parser;
use Wikimedia\CSS\Sanitizer\StylesheetSanitizer;
/** Analýza stylového listu z řetězce **/
$parser = Parser::newFromString( $cssText );
$stylesheet = $parser->parseStylesheet();
/** Nahlásit jakékoli chyby parseru **/
foreach ( $parser->getParseErrors() as list( $code, $line, $pos ) ) {
// $code je řetězec, který by měl být vhodný jako klíč pro knihovnu i18n.
// Podrobnosti viz errors.md.
$error = lookupI18nMessage( "css-parse-error-$code" );
echo "Parse error: $error at line $line character $pos\n";
}
/** Použití sanitizace na stylový list **/
// Pokud potřebujete upravit výchozí hodnoty, zkopírujte kód této metody a upravte jej.
$sanitizer = StylesheetSanitizer::newDefault();
$newStylesheet = $sanitizer->sanitize( $stylesheet );
/** Nahlaste jakékoli chyby vylepšení **/
foreach ( $sanitizer->getSanitizationErrors() as list( $code, $line, $pos ) ) {
// $code je řetězec, který by měl být vhodný jako klíč pro knihovnu i18n.
// Podrobnosti viz errors.md.
$error = lookupI18nMessage( "css-sanitization-error-$code" );
echo "Sanitization error: $error at line $line character $pos\n";
}
/** Převést upravený stylový list zpět na text **/
$newText = (string)$newStylesheet;
// Nebo pokud byste to raději měli také minimalizované
$minifiedText = Wikimedia\CSS\Util::stringify( $newStylesheet, [ 'minify' => true ] );
Historie
Potřebovali jsme CSS čistič s několika vlastnostmi:
- Přísná analýza dle moderních standardů.
- Zahrnuje pozici řádku a znaku pro všechny chyby.
- Konfigurovatelné pro omezení nebezpečných konstrukcí, jako jsou externí odkazy na URL.
- Chyby lze snadno lokalizovat.
Nenašli jsme knihovnu, která by splňovala tyto požadavky, a tak jsme ji vytvořili.