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
|
<?php
|
||||||
namespace Isekai\Widgets;
|
namespace Isekai\Widgets;
|
||||||
|
|
||||||
|
use MapCacheLRU;
|
||||||
|
|
||||||
class Widgets {
|
class Widgets {
|
||||||
public static function onParserSetup(&$parser){
|
public static function onParserSetup(&$parser){
|
||||||
|
$parser->extIsekaiWidgetsCache = new MapCacheLRU( 100 ); // 100 is arbitrary
|
||||||
|
|
||||||
$parser->setHook('createpage', CreatePageWidget::class . '::create');
|
$parser->setHook('createpage', CreatePageWidget::class . '::create');
|
||||||
$parser->setHook('discoverbox', DiscoverWidget::class . '::create');
|
$parser->setHook('discoverbox', DiscoverWidget::class . '::create');
|
||||||
$parser->setHook('previewcard', PreviewCardWidget::class . '::create');
|
$parser->setHook('previewcard', PreviewCardWidget::class . '::create');
|
||||||
|
|
||||||
$parser->setHook('tile', TileWidget::class . '::create');
|
$parser->setHook('tile', TileWidget::class . '::create');
|
||||||
$parser->setHook('tilegroup', TileGroupWidget::class . '::create');
|
$parser->setHook('tilegroup', TileGroupWidget::class . '::create');
|
||||||
|
|
||||||
|
$parser->setHook('fontface', FontFaceWidget::class . '::create');
|
||||||
|
$parser->setHook('exfont', ExtraFontWidget::class . '::create');
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,5 +1,5 @@
|
|||||||
<div class="isekai-preview-card-wrapper">
|
<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">
|
||||||
<div class="card-header-title">
|
<div class="card-header-title">
|
||||||
<div class="card-header-title-text"><?php echo $displayTitle; ?></div>
|
<div class="card-header-title-text"><?php echo $displayTitle; ?></div>
|
Loading…
Reference in New Issue