<?php namespace Isekai\Widgets; use Title; use MediaWiki\MediaWikiServices; class FontFaceWidget { /** * @param string $text * @param array $params * @param \Parser $parser * @param \PPFrame $frame */ public static function create($text, $params, $parser, $frame) { if (!isset($params['src']) || !isset($params['name']) || empty($params['src']) || empty($params['name'])) { return '<span class="error">' . wfMessage('isekai-fontface-error-invalid-params')->parse() . '</span>'; } $service = MediaWikiServices::getInstance(); $fontName = 'extra-' . $params['name']; $existsFonts = $parser->extIsekaiWidgetsCache->get('extraFonts', INF, []); if (isset($existsFonts[$fontName])) { return '<span class="error">' . wfMessage('isekai-fontface-error-font-already-defined', $params['name'])->parse() . '</span>'; } if (preg_match('/[`~!@#$%^&*()+=<>?:"{}|,.\/;\'\\\\\[\]]\r\n/', $fontName)) { return '<span class="error">' . wfMessage('isekai-fontface-error-font-name-invalid')->parse() . '</span>'; } $title = Title::newFromText($params['src'], NS_FILE); $file = $service->getRepoGroup()->findFile($title); if (!$file) { return '<span class="error">' . wfMessage('isekai-fontface-error-font-not-exists', $params['src'])->parse() . '</span>'; } $fontUrl = $file->getUrl(); $fontId = substr(Utils::safeBase64Encode(md5($fontName, true)), 0, 8); $css = "<span><style>@font-face{src: url('{$fontUrl}');font-family:'{$fontName}'}" . ".isekai-extra-font.font-{$fontId}{font-family:'{$fontName}'}</style></span>"; $existsFonts[$fontName] = $fontId; $existsFonts = $parser->extIsekaiWidgetsCache->set('extraFonts', $existsFonts); return [$css, "markerType" => 'nowiki']; } }