Add FontFace widget and update widgets
parent
469c253b09
commit
74a88f6217
Binary file not shown.
@ -0,0 +1,10 @@
|
||||
## 预览卡片设计
|
||||
```html
|
||||
<previewCard>
|
||||
[[链接1]]
|
||||
[[链接2]]
|
||||
</previewCard>
|
||||
<previewCard>
|
||||
<categorytree mode="pages" depth="1" hideroot="on" showcount="on" />
|
||||
</previewCard>
|
||||
```
|
@ -0,0 +1,39 @@
|
||||
<?php
|
||||
namespace Isekai\Widgets;
|
||||
|
||||
use Html;
|
||||
|
||||
class ExtraFontWidget {
|
||||
public static function create($text, $params, $parser, $frame){
|
||||
$existsFonts = $parser->extIsekaiWidgetsCache->get('extraFonts', INF, []);
|
||||
|
||||
$content = $text = $frame->expand($text);
|
||||
if (!isset($params['name']) || empty($params['name'])) {
|
||||
return '<span class="error">' . wfMessage('isekai-font-error-invalid-params')->parse() . '</span>' . $content;
|
||||
}
|
||||
|
||||
$fontName = 'extra-' . $params['name'];
|
||||
if (preg_match('/[`~!@#$%^&*()+=<>?:"{}|,.\/;\'\\\\\[\]]\r\n/', $fontName)) {
|
||||
return '<span class="error">' .
|
||||
wfMessage('isekai-font-error-font-name-invalid')->parse() .
|
||||
'</span>' .
|
||||
$content;
|
||||
}
|
||||
|
||||
$existsFonts = $parser->extIsekaiWidgetsCache->get('extraFonts', INF, []);
|
||||
if (!isset($existsFonts[$fontName])) {
|
||||
return '<span class="error">' .
|
||||
wfMessage('isekai-font-error-font-not-imported', $params['name'])->parse() .
|
||||
'</span>' .
|
||||
$content;
|
||||
}
|
||||
$fontId = $existsFonts[$fontName];
|
||||
|
||||
return [
|
||||
Html::rawElement('span', [
|
||||
'class' => 'isekai-extra-font font-' . $fontId,
|
||||
], $content),
|
||||
"markerType" => 'nowiki'
|
||||
];
|
||||
}
|
||||
}
|
@ -0,0 +1,53 @@
|
||||
<?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 = "<style>@font-face{src: url('{$fontUrl}');font-family:'{$fontName}'}" .
|
||||
".isekai-extra-font.font-{$fontId}{font-family:'{$fontName}'}</style>";
|
||||
|
||||
$existsFonts[$fontName] = $fontId;
|
||||
$existsFonts = $parser->extIsekaiWidgetsCache->set('extraFonts', $existsFonts);
|
||||
|
||||
return [$css, "markerType" => 'nowiki'];
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
<?php
|
||||
namespace Isekai\Widgets;
|
||||
|
||||
class Utils {
|
||||
public static function safeBase64Encode($input) {
|
||||
return str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($input));
|
||||
}
|
||||
}
|
@ -1,14 +1,21 @@
|
||||
<?php
|
||||
namespace Isekai\Widgets;
|
||||
|
||||
use MapCacheLRU;
|
||||
|
||||
class Widgets {
|
||||
public static function onParserSetup(&$parser){
|
||||
$parser->extIsekaiWidgetsCache = new MapCacheLRU( 100 ); // 100 is arbitrary
|
||||
|
||||
$parser->setHook('createpage', CreatePageWidget::class . '::create');
|
||||
$parser->setHook('discoverbox', DiscoverWidget::class . '::create');
|
||||
$parser->setHook('previewcard', PreviewCardWidget::class . '::create');
|
||||
|
||||
$parser->setHook('tile', TileWidget::class . '::create');
|
||||
$parser->setHook('tilegroup', TileGroupWidget::class . '::create');
|
||||
|
||||
$parser->setHook('fontface', FontFaceWidget::class . '::create');
|
||||
$parser->setHook('exfont', ExtraFontWidget::class . '::create');
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
<div class="isekai-preview-card-wrapper">
|
||||
<div class="isekai-preview-card" data-title="<?php echo $title; ?>">
|
||||
<div class="isekai-preview-card card-media" data-title="<?php echo $title; ?>">
|
||||
<div class="card-header">
|
||||
<div class="card-header-title">
|
||||
<div class="card-header-title-text"><?php echo $displayTitle; ?></div>
|
Loading…
Reference in New Issue