Add cover argument for Tile Widget.

master
落雨楓 3 years ago
parent 74a88f6217
commit 706e051d2e

@ -2,6 +2,7 @@
namespace Isekai\Widgets; namespace Isekai\Widgets;
use Html; use Html;
use MediaWiki\MediaWikiServices;
use Title; use Title;
class TileWidget { class TileWidget {
@ -11,28 +12,36 @@ class TileWidget {
private $href = ''; private $href = '';
private $badge = false; private $badge = false;
private $color = false; private $color = false;
private $cover = false;
private $images = []; private $images = [];
private $grid = false; private $grid = false;
private $attributes = []; private $attributes = [];
public function __construct($args){ public function __construct($args, $content){
$this->content = $content;
$this->parseArgs($args); $this->parseArgs($args);
} }
public static function create(string $text, array $args, \Parser $parser, \PPFrame $frame){ public static function create(string $text, array $args, \Parser $parser, \PPFrame $frame){
$parser->getOutput()->addModules('ext.isekai.tile'); $parser->getOutput()->addModules('ext.isekai.tile');
if($text){ $content = '';
$args['title'] = $text; if ($text) {
$content = $frame->expand($text);
$title = preg_replace('/\[\[.*?\]\]/', '', $content);
$title = preg_replace('/<img .*?src="(?<src>.*?)".*?srcset="(?<srcset>.*?)"[^\>]+>/', '', $title);
$title = strip_tags(trim($title));
$args['title'] = $title;
} }
$tile = new TileWidget($args); $tile = new TileWidget($args, $content);
return [$tile->toHtml(), 'markerType' => 'nowiki']; return [$tile->toHtml(), 'markerType' => 'nowiki'];
} }
private function parseArgs($args){ private function parseArgs($args){
$allowedArgs = ['size', 'icon', 'title', 'badge', 'color', 'href', 'grid']; $allowedArgs = ['size', 'icon', 'title', 'cover', 'badge', 'color', 'href', 'grid'];
foreach($args as $name => $arg){ foreach($args as $name => $arg){
if(in_array($name, $allowedArgs)){ if(in_array($name, $allowedArgs)){
@ -68,6 +77,10 @@ class TileWidget {
} }
} }
private function getCoverArgs(array &$element, array &$content){
$element['data-cover'] = $this->cover;
}
private function getHrefArgs(array &$element, array &$content){ private function getHrefArgs(array &$element, array &$content){
if(substr($this->href, 0, 2) == '[[' && substr($this->href, -2, 2) == ']]'){ //内部链接 if(substr($this->href, 0, 2) == '[[' && substr($this->href, -2, 2) == ']]'){ //内部链接
$titleText = substr($this->href, 2, strlen($this->href) - 4); $titleText = substr($this->href, 2, strlen($this->href) - 4);
@ -117,6 +130,27 @@ class TileWidget {
} }
private function getImagesArgs(array &$element, array &$content){ private function getImagesArgs(array &$element, array &$content){
/*$service = MediaWikiServices::getInstance();
$this->images = [];
// 提取wikitext图片
preg_match_all('/\[\[(?<title>.+?:.+?)(\|.*?)?\]\]/', $this->content, $matches);
if (isset($matches['title']) && !empty($matches['title'])) {
foreach ($matches['title'] as $titleText) {
$title = Title::newFromText($titleText);
if ($title->inNamespace(NS_FILE)) {
$file = $service->getRepoGroup()->findFile($title);
$thumb = $file->getUrl();
$this->images[] = $thumb;
}
}
}
// 提取html图片
preg_match_all('/<img .*?src="(?<src>.*?)".*?srcset="(?<srcset>.*?)"[^\>]+>/', $this->content, $matches);
if (isset($matches['src']) && !empty($matches['src'])) {
$this->images = array_merge($this->images, $matches['src']);
}*/
if(!empty($this->images)){ if(!empty($this->images)){
$element['data-effect'] = 'image-set'; $element['data-effect'] = 'image-set';
foreach($this->images as $image){ foreach($this->images as $image){
@ -158,6 +192,7 @@ class TileWidget {
$this->getColorArgs($element, $content); $this->getColorArgs($element, $content);
$this->getIconArgs($element, $content); $this->getIconArgs($element, $content);
$this->getTitleArgs($element, $content); $this->getTitleArgs($element, $content);
$this->getCoverArgs($element, $content);
$this->getHrefArgs($element, $content); $this->getHrefArgs($element, $content);
$this->getBadgeArgs($element, $content); $this->getBadgeArgs($element, $content);
$this->getImagesArgs($element, $content); $this->getImagesArgs($element, $content);

@ -31,6 +31,10 @@ isekai.tile.init = function () {
}; };
(function($){ (function($){
function rand(min, max) { // min and max included
return Math.floor(Math.random() * (max - min + 1) + min)
}
var Utils = { var Utils = {
isValue: function(val){ isValue: function(val){
return val !== undefined && val !== null && val !== ""; return val !== undefined && val !== null && val !== "";
@ -585,7 +589,7 @@ isekai.tile.init = function () {
var temp = this.images.slice(); var temp = this.images.slice();
for(var i = 0; i < 5; i++) { for(var i = 0; i < 5; i++) {
var rnd_index = $.random(0, temp.length - 1); var rnd_index = rand(0, temp.length - 1);
var div = $("<div>").addClass("img -js-img-"+i).css("background-image", "url("+temp[rnd_index].src+")"); var div = $("<div>").addClass("img -js-img-"+i).css("background-image", "url("+temp[rnd_index].src+")");
element.prepend(div); element.prepend(div);
temp.splice(rnd_index, 1); temp.splice(rnd_index, 1);
@ -596,12 +600,12 @@ isekai.tile.init = function () {
$.setInterval(function(){ $.setInterval(function(){
var temp = that.images.slice(); var temp = that.images.slice();
var colors = Colors.colors(Colors.PALETTES.ALL), bg; var colors = Colors.colors(Colors.PALETTES.ALL), bg;
bg = colors[$.random(0, colors.length - 1)]; bg = colors[rand(0, colors.length - 1)];
element.css("background-color", bg); element.css("background-color", bg);
for(var i = 0; i < a.length; i++) { for(var i = 0; i < a.length; i++) {
var rnd_index = $.random(0, temp.length - 1); var rnd_index = rand(0, temp.length - 1);
var div = element.find(".-js-img-"+a[i]); var div = element.find(".-js-img-"+a[i]);
switchImage(div, temp[rnd_index].src, i); switchImage(div, temp[rnd_index].src, i);
temp.splice(rnd_index, 1); temp.splice(rnd_index, 1);

Loading…
Cancel
Save