You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
4.9 KiB
PHTML
144 lines
4.9 KiB
PHTML
3 years ago
|
<?php
|
||
|
namespace Isekai;
|
||
|
|
||
|
class InfoBox {
|
||
|
public $title = '', $titleColor = '', $avatar = '', $datas = [], $float = '';
|
||
|
public $defaultSet = [
|
||
|
'人设' => [
|
||
|
'title' => '基本资料',
|
||
|
'float' => 'right',
|
||
|
'titleColor' => '#0088dd',
|
||
|
],
|
||
|
'基本资料' => [
|
||
|
'title' => '基本资料',
|
||
|
'float' => 'right',
|
||
|
'titleColor' => '#0088dd',
|
||
|
],
|
||
|
'参数' => [
|
||
|
'title' => '基本参数 (0-10)',
|
||
|
'titleColor' => '#33ccff',
|
||
|
],
|
||
|
'基本参数' => [
|
||
|
'title' => '基本参数 (0-10)',
|
||
|
'titleColor' => '#33ccff',
|
||
|
],
|
||
|
];
|
||
|
|
||
|
public function __construct($args){
|
||
|
$this->parseArgs($args);
|
||
|
}
|
||
|
|
||
|
public function parseArgs($args){
|
||
|
foreach($args as $one){
|
||
|
if(is_string($one)){
|
||
|
if($one == '居右'){
|
||
|
$this->float = 'right';
|
||
|
} elseif($one == '居左'){
|
||
|
$this->float = 'left';
|
||
|
} elseif($this->avatar == '' && preg_match('/\[\[文件:/', $one)){
|
||
|
$this->avatar = str_replace(['|缩略图', '|有框'], '|无框', $one);
|
||
|
} elseif($this->title == '') {
|
||
|
preg_match('/\[(#[0-9a-fA-F]{3,6}|#[0-9a-fA-F]{3,6},#[0-9a-fA-F]{3,6}|,#[0-9a-fA-F]{3,6})\]/', $one, $match);
|
||
|
if(count($match) > 0){
|
||
|
$this->titleColor = str_replace(['[', ']'], '', $match[0]);
|
||
|
$this->title = trim(str_replace($match[0], '', $one));
|
||
|
} else {
|
||
|
$this->title = $one;
|
||
|
}
|
||
|
if(isset($this->defaultSet[$this->title])){
|
||
|
$data = $this->defaultSet[$this->title];
|
||
|
if(isset($data['title'])){
|
||
|
$this->title = $data['title'];
|
||
|
}
|
||
|
if(isset($data['float']) && $this->float == ''){
|
||
|
$this->float = $data['float'];
|
||
|
}
|
||
|
if(isset($data['titleColor']) && $this->titleColor == ''){
|
||
|
$this->titleColor = $data['titleColor'];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
$this->datas[$one[0]] = $one[1];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function getHtml(){
|
||
|
$ret = "<div class=\"wikitable-container\"";
|
||
|
switch($this->float){
|
||
|
case 'left':
|
||
|
$ret .= ' style="float: left; margin-right: 5px;"';
|
||
|
break;
|
||
|
case 'right':
|
||
|
$ret .= ' style="float: right; margin-left: 5px;"';
|
||
|
break;
|
||
|
}
|
||
|
$ret .= ">\r\n{| class=\"wikitable\"\r\n";
|
||
|
if($this->avatar != ''){
|
||
|
$ret .= "|-\r\n| colspan=2 | " . $this->avatar . "\r\n";
|
||
|
}
|
||
|
if($this->title != ''){
|
||
|
$ret .= "|-\r\n| colspan=2 style=\"text-align:center;";
|
||
|
//开始填充style项目
|
||
|
if($this->titleColor != ''){
|
||
|
$ret .= 'background-color:' . $this->titleColor . ';';
|
||
|
if($this->isLightColor($this->titleColor)){
|
||
|
$ret .= 'color:#000;';
|
||
|
} else {
|
||
|
$ret .= 'color:#fff;';
|
||
|
}
|
||
|
}
|
||
|
//填充内容
|
||
|
$ret .= '" | ' . $this->title . "\r\n";
|
||
|
}
|
||
|
foreach($this->datas as $name => $value){
|
||
|
$ret .= "|-\r\n| " . $name . " || style=\"text-align:center\" | " . $value . "\r\n";
|
||
|
}
|
||
|
$ret .= "|}\r\n</div>";
|
||
|
return $ret;
|
||
|
}
|
||
|
|
||
|
public function getRgb($hex){
|
||
|
$hex = str_replace('#', '', $hex);
|
||
|
$rgb = [];
|
||
|
if(strlen($hex) == 3){
|
||
|
$rgb[0] = $hex[0] . $hex[0];
|
||
|
$rgb[1] = $hex[1] . $hex[1];
|
||
|
$rgb[2] = $hex[2] . $hex[2];
|
||
|
} else {
|
||
|
$rgb[0] = $hex[0] . $hex[1];
|
||
|
$rgb[1] = $hex[2] . $hex[3];
|
||
|
$rgb[2] = $hex[4] . $hex[5];
|
||
|
}
|
||
|
foreach($rgb as $key => $one){
|
||
|
$rgb[$key] = ord(hex2bin($one));
|
||
|
}
|
||
|
return $rgb;
|
||
|
}
|
||
|
|
||
|
public function isLightColor($hex){
|
||
|
$rgb = $this->getRgb($hex);
|
||
|
return array_sum($rgb) >= 382;
|
||
|
}
|
||
|
|
||
|
public static function onParserSetup(&$parser){
|
||
|
$parser->setFunctionHook('infobox', 'Isekai\\InfoBox::createInfoBox');
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
public static function createInfoBox(){
|
||
|
$args = func_get_args();
|
||
|
$targetArgs = [];
|
||
|
for($i = 1; $i < count($args); $i ++){
|
||
|
$t = explode('=', $args[$i]);
|
||
|
if(count($t) == 2){
|
||
|
$targetArgs[] = [trim($t[0]), trim($t[1])];
|
||
|
} else {
|
||
|
$targetArgs[] = $args[$i];
|
||
|
}
|
||
|
}
|
||
|
$infobox = new InfoBox($targetArgs);
|
||
|
return $infobox->getHtml();
|
||
|
}
|
||
|
}
|