<?php

namespace TypechoPlugin\NewAdmin;

use Typecho\Plugin\PluginInterface;
use Typecho\Widget\Helper\Form;
use Typecho\Widget;
use Widget\Options;
use Utils\Helper; 
use Widget\Base;
use Widget\User;
use Typecho\Common;
use Widget\Plugins\Config;
use Widget\Themes\Files;
use Widget\Users\Edit as UsersEdit;
use Widget\Contents\Attachment\Edit as AttachmentEdit;
use Widget\Contents\Post\Edit as PostEdit;
use Widget\Contents\Page\Edit as PageEdit;
use Widget\Contents\Post\Admin as PostAdmin;
use Widget\Comments\Admin as CommentsAdmin;
use Widget\Metas\Category\Admin as CategoryAdmin;
use Widget\Metas\Category\Edit as CategoryEdit;
use Widget\Metas\Tag\Admin as TagAdmin;

if (!defined('__TYPECHO_ROOT_DIR__')) {
    exit;
}

/**
 * NewAdmin是一款Typecho的后台美化插件（支持typecho1.2.0~1.3.0版本），购买后禁止二次分发或售卖(包含二次开发后分发以及售卖)行为！
 *
 * @package NewAdmin
 * @author 泽泽社长
 * @version 2.6.0
 * @link https://typecho.fans/archives/newadmin-typecho-plugin.html
 */
class Plugin implements PluginInterface
{
    /**
     * 激活插件方法,如果激活失败,直接抛出异常
     */
    public static function activate()
    {
        \Typecho\Plugin::factory('admin/header.php')->header_15 =  __CLASS__ . '::render';
        \Typecho\Plugin::factory('admin/footer.php')->begin_15 =  __CLASS__ . '::footerjs';
        \Typecho\Plugin::factory('admin/menu.php')->navBar_15 =  __CLASS__ . '::remenu';
        \Typecho\Plugin::factory('Widget_Abstract_Comments')->gravatar = __CLASS__ . '::pltx';
        \Typecho\Plugin::factory('Widget_Abstract_Comments')->filter = __CLASS__ . '::urlfilter';
    }

    /**
     * 禁用插件方法,如果禁用失败,直接抛出异常
     */
    public static function deactivate()
    {
    }

    /**
     * 获取插件配置面板
     *
     * @param Form $form 配置面板
     */
    public static function config(Form $form)
    {
        // 后台加速
        $speed = new Form\Element\Radio('speed', array('0' => _t('不加速'), '1' => _t('加速'), '2' => _t('超级加速')), 0, _t('后台加速'), _t('开启后有效提高后台页面间切换速度，推荐使用【加速】模式即可，【超级加速】有点浪费服务器资源,目前仅在 Chrome 113+、Edge 113+等浏览器支持，当前你的浏览器：<span id="NewAdminTip" style="background: #00b5ff;display: inline-flex;border-radius: 5px;color: #fff;padding: 0 4px;"></span>'));
        $form->addInput($speed);
        
        // 动画
        $animation = new Form\Element\Radio('animation', array('0' => _t('无动画'), 'fade' => _t('淡入效果'), 'move' => _t('左移效果'), 'pop' => _t('放大效果'),'slideup' => _t('上滑效果')), '0', _t('页面切换动画'), _t('页面切换时展示的动画效果，Chrome111版本及以上支持，safari18及以上版本支持，不支持的浏览器就相当于没有动画'));
        $form->addInput($animation);
        
        // 布局风格
        $style = new Form\Element\Radio('style', array('1' => _t('默认风格'), '2' => _t('加点高斯模糊效果')), '1', _t('布局风格'));
        $style->setAttribute('id', 'zestyle');
        $form->addInput($style);
        
        // LOGO
        $logo = new Form\Element\Text('logo', NULL, NULL, _t('LOGO地址'), _t('填写图片地址，不填留空则显示用户头像'));
        $logo->input->setAttribute('id', 'zelogo');
        $form->addInput($logo);
        
        // 背景色
        $color = new Form\Element\Text('color', NULL, '#ffffff', _t('侧栏背景色'), _t('仅在日间模式下生效，夜间模式下无效'));
        $color->input->setAttribute('type', 'color');
        $color->input->setAttribute('id', 'zecolor');
        $form->addInput($color);
        
        // bg
        $bg = new Form\Element\Text('bg', NULL, NULL, _t('左侧栏背景图'), _t('填写图片地址,背景图优先级高于背景色，仅在日间模式下生效，夜间模式下无效'));
        $bg->input->setAttribute('id', 'zebg');
        $form->addInput($bg); 
        
        // 背景模糊
        $bglj = new Form\Element\Radio('bglj', array('0' => _t('关闭'),'1' => _t('开启')), '0', _t('背景图模糊'), _t('左侧栏背景图模糊效果'));
        $bglj->setAttribute('id', 'zebglj');
        $form->addInput($bglj);
        
        // 登录美化过滤
        $loginstyle = new Form\Element\Radio('loginstyle', array('0' => _t('关闭'), '1' => _t('开启'), ), '0', _t('登录/注册美化'), _t('开启后会同时美化Typecho后天的登录/注册页面，选择关闭就是不美化（也可以选用其他专门美化登录注册页面的插件）'));
        $form->addInput($loginstyle);
        // 登录背景图
        $dlbg = new Form\Element\Text('dlbg', NULL, NULL, _t('登录注册背景图'), _t('填写图片地址，留空保存后则默认内置的，需开启上方的【登录/注册美化】功能'));
        $form->addInput($dlbg);
        
        // 评论过滤
        $urlfilter = new Form\Element\Radio('urlfilter', array('0' => _t('不处理'), '1' => _t('隐藏评论url'), '2' => _t('隐藏15天前的评论url'), '3' => _t('隐藏30天前的评论url'), '5' => _t('隐藏60天前的评论url')), '0', _t('评论网址管控'), _t('过于久远评论url，可能存在失效或变为违法站点，所以可以开启此功能关闭过久的评论url'));
        $form->addInput($urlfilter);
        
        
        $gravatars = new Form\Element\Select('gravatars', array(
            'weavatar.com/avatar' =>_t('weavatar[建议]'),
            'cn.cravatar.com/avatar' => _t('Cravatar源[推荐]'),
            'www.gravatar.com/avatar' => _t('Gravatar的www源'),
            'cn.gravatar.com/avatar' => _t('Gravatar的cn源'),
            'secure.gravatar.com/avatar' => _t('Gravatar的secure源'),
            'sdn.geekzu.org/avatar' => _t('极客族'),
            'gravatar.proxy.ustclug.org/avatar' => _t('中科大[不建议]'),
            'cdn.v2ex.com/gravatar' => _t('v2ex源[建议]'),
            'dn-qiniu-avatar.qbox.me/avatar' => _t('七牛源[不建议]'),
            'cdn.helingqi.com/avatar' => _t('禾令奇[建议]'),
            'gravatar.loli.net/avatar' => _t('loli.net源'),
        ), 'weavatar.com/avatar',
        _t('邮箱gravatar头像源'), _t('默认weavatar.com/avatar'));
        $form->addInput($gravatars->multiMode());


        // 屏蔽typecho更新提醒
        $updateNotice = new Form\Element\Radio('updateNotice', ['0' => _t('不屏蔽'), '1' => _t('屏蔽')], '0', _t('屏蔽typecho更新提醒'));
        $form->addInput($updateNotice);
	
    }

    /**
     * 个人用户的配置面板
     *
     * @param Form $form
     */
    public static function personalConfig(Form $form)
    {}
    public static function render($hed)
    {
$VERSION='2.6.0';
$plugin = Options::alloc()->plugin('NewAdmin');
$url=Helper::options()->pluginUrl.'/NewAdmin/assets/';
\Widget\Options::alloc()->to($options);
\Widget\User::alloc()->to($user);
$request = $options->request;
\Widget\Menu::alloc()->to($menu);
if(User::alloc()->hasLogin() && !defined('NewAdminIndex') && strpos($menu->getCurrentMenu()[2],'index.php') !== false){
    define('NewAdminIndex', 1);//使用全局变量确保只加载一次
    include('admin.php');exit;
}

//logo设置
$logo= isset($plugin->logo) ? $plugin->logo : '';

$bg = isset($plugin->bg) ? $plugin->bg : '';

$bglj = isset($plugin->bglj) ? $plugin->bglj : 0;

$color= isset($plugin->color) ? $plugin->color : '';

//布局风格
$rel= $plugin->style==2 ? '': 'alternate ';

$darkdisabled='';
if(!isset($_COOKIE['dark'])||$_COOKIE['dark']=='false'||$_COOKIE['dark']=='light'){$darkdisabled='disabled="true"';}


//后台头像源
if (!defined('__TYPECHO_GRAVATAR_PREFIX__')) {
  define('__TYPECHO_GRAVATAR_PREFIX__', '//'.$plugin->gravatars.'/');
}

$config='';

if (User::alloc()->hasLogin()){
$config=$config.'<script x-init="$store.ze.logo=\''.$logo.'\';$store.ze.bg=\''.$bg.'\';$store.ze.bglj=\''.$bglj.'\';$store.ze.color=\''.$color.'\';">var NewAdmin = {"path":"'.$url.'","UserPic":"'.self::mailtx($user->mail).'",zftx:"'.self::letter_avatar($user->screenName).'",};</script>
<style>*{--sidebg:'.$color.';--focus:rgb(236 236 236 / 50%);}</style>
';

$hed=$hed.$config. '<link rel="stylesheet" href="'.$url.'main.css?'.$VERSION.'"><link rel="stylesheet" href="'.$url.'style.css?'.$VERSION.'"><link href="'.$url.'style2.css?'.$VERSION.'" rel="'.$rel.'stylesheet" type="text/css" title="buju"><link rel="stylesheet" href="'.$url.'dark.css?'.$VERSION.'" id="darkcss" '.$darkdisabled.'>';

if($plugin->animation){
  $hed=$hed.'<link rel="stylesheet" href="'.$url.'animation/'.$plugin->animation.'.css?'.$VERSION.'">';  
}


}else{

if($plugin->loginstyle){
$hed=$hed.'<link rel="stylesheet" href="'.$url.'login.css?'.$VERSION.'">';
$hed= $plugin->dlbg ? $hed.'<style>body {background-image: url('.$plugin->dlbg.');}</style>' : $hed;
}

}
return '<meta name="format-detection" content="telephone=no">'.$hed;
    }
    
public static function remenu(){
    if(!defined('NewAdminMenu')){
define('NewAdminMenu', 1);//使用全局变量确保只加载一次
\Widget\Options::alloc()->to($options);
$icons=$options->pluginUrl.'/NewAdmin/assets/img/icons.svg?2'; 
\Widget\User::alloc()->to($user);
$request = $options->request;
$plugin = Options::alloc()->plugin('NewAdmin');

$logo=$plugin->logo ? $plugin->logo : self::mailtx($user->mail,'blank');

ob_start();
?>
<?php \Typecho\Plugin::factory('admin/menu.php')->navBar(); ?><a title="<?php
        if ($user->logged > 0) {
            $logged = new \Typecho\Date($user->logged);
            _e('最后登录: %s', $logged->word());
        }
        ?>" href="<?php $options->adminUrl('profile.php'); ?>" class="author"><?php $user->screenName(); ?></a><a
            class="exit" href="<?php $options->logoutUrl(); ?>"><?php _e('登出'); ?></a><a
            href="<?php $options->siteUrl(); ?>"><?php _e('网站'); ?></a>
<?php
$more = ob_get_clean();    
$menu=self::output();
$dark='false';$darkclass='';
if(isset($_COOKIE['dark'])&&($_COOKIE['dark']=='true'||$_COOKIE['dark']=='dark')){$dark='true';$darkclass='dark';}

$Version=str_replace('.', '', \Widget\Options::alloc()->Version);

$VersionClass = $Version >=130 ? 'typecho13' : 'typecho12';
$newheader = '<div id="newadmin" :class="{\'dark\':$store.ze.dark}"
x-init="
$store.ze.dark='.$dark.';
if (document.cookie.indexOf(\'dark\') < 0) {
darkModeQuery = window.matchMedia(\'(prefers-color-scheme: dark)\');
darkModeQuery.addListener(handleColorSchemeChange);
handleColorSchemeChange(darkModeQuery); 
function handleColorSchemeChange(event) {
if (event.matches) {darkmode(1,1);
}else{darkmode(0,1);}
}
}
" class="'.$darkclass.' '.$VersionClass.'"><div class="newadmin buju" :class="{\'newleft\':left}" x-data="{menu:false,left:false}"><div class="headermenu"><button @click="menu=!menu;$(\'body\').addClass(\'overflow-hidden\')" class="menubtn"><svg class="menusvg" aria-hidden="true"><use xlink:href="'.$icons.'#icon-menu"></use></svg></button><button @click="left=!left;$(\'.main\').toggleClass(\'mainleft\');" class="leftbtn"><svg class="leftsvg" aria-hidden="true" :class="{\'rotate\':left}"><use xlink:href="'.$icons.'#icon-left"></use></svg></button><div class="rightmore"><button @click="darkmode(!$store.ze.dark);"><svg class="sunsvg" aria-hidden="true"><use xlink:href="'.$icons.'#icon-sun"></use></svg><svg class="moonsvg" aria-hidden="true"><use xlink:href="'.$icons.'#icon-Moon"></use></svg></button><div class="pcmore">'.$more.'</div><div class="more" x-data="{more:false}" @click.outside="more= false"><button @click="more=!more"><svg class="moresvg" aria-hidden="true"><use xlink:href="'.$icons.'#icon-more"></use></svg></button><div class="moreul moreulscale0" x-cloak :class="{\'moreulscale\':!more}">'.$more.'</div></div></div>
</div><div class="zhezhao" x-cloak x-show="menu" x-cloak @click="menu=false;$(\'body\').removeClass(\'overflow-hidden\')"><svg class="xsvg" aria-hidden="true"><use xlink:href="'.$icons.'#icon-x"></use></svg></div><div class="side" :class="{\'close\':menu,\'left\':left}" :style="\'background:\'+$store.ze.color+\';\'"><div class="aside"><div class="menucon"><a href="'.Helper::options()->adminUrl.'" style="text-align: center;"><div class="zetx">
<img class="zhelogo a" src="'.$logo.'" :src="if($store.ze.logo){return $store.ze.logo;}else{return \''.$logo.'\';}"><img class="zhelogo b" src="'.self::letter_avatar($user->screenName).'"><template x-if="isNationalDayHoliday"><span x-html="isNationalDayHoliday"></span></template></div>
</a><div class="menu">'.$menu.'</div></div><div :class="{\'bglvjing\':$store.ze.bglj==1}"></div><img class="bgimg" :src="$store.ze.bg" referrerpolicy="no-referrer" x-show="$store.ze.bg" x-cloak></div></div></div>';


echo $Version>=130 ? '</li></menu></nav></header>'.$newheader.'<header class="hidden"><nav><menu><li>' : '</div></div>'.$newheader.'<div class="hidden"><div>';

    }
}


    public static function footerjs()
    {
$VERSION='2.6.0';
$plugin = Options::alloc()->plugin('NewAdmin');
$ft='';
if (User::alloc()->hasLogin()){
\Widget\Options::alloc()->to($options);
$url=$options->pluginUrl.'/NewAdmin/assets/'; 
$ft=$ft. '</div>';

if($plugin->speed){
$speedmode = $plugin->speed==1 ? 'moderate' : 'eager';
$adminDir = __TYPECHO_ADMIN_DIR__;
$ft=$ft. '
<script type="speculationrules">{"prefetch":[{"where":{"href_matches":["'.$adminDir.'","'.$adminDir.'profile.php","'.$adminDir.'plugins.php","'.$adminDir.'themes.php","'.$adminDir.'backup.php","'.$adminDir.'extending.php","'.$adminDir.'write-post.php","'.$adminDir.'write-page.php","'.$adminDir.'manage-posts.php","'.$adminDir.'manage-pages.php","'.$adminDir.'manage-comments.php","'.$adminDir.'manage-categories.php","'.$adminDir.'manage-tags.php","'.$adminDir.'manage-medias.php","'.$adminDir.'manage-users.php","'.$adminDir.'options-general.php","'.$adminDir.'options-discussion.php","'.$adminDir.'options-reading.php","'.$adminDir.'options-permalink.php","'.$adminDir.'options-plugin.php","'.$adminDir.'theme-editor.php","'.$adminDir.'options-theme.php","'.$adminDir.'category.php","'.$adminDir.'media.php","'.$adminDir.'user.php"]},"eagerness":"'.$speedmode.'"}]}</script>
';
}

$ft=$ft. '<script defer src="'.$url.'intersect.min.js"></script><script src="'.$url.'alpinejs3.14.8.min.js" defer></script><script src="'.$url.'NewAdmin.js?'.$VERSION.'"></script>'; 
    }
echo $ft;
    }

//评论头像
public static function pltx($size, $rating, $default, $obj) {
$email =$obj->mail;
$url=Helper::options()->pluginUrl.'/NewAdmin/img/logo.svg'; 
\Widget\Menu::alloc()->to($menu);

if( $email && strpos($menu->getCurrentMenu()[2],'manage-comments.php') !== false){
 $url = self::mailtx($email,'blank');
}else{
 $url = Common::gravatarUrl($email, 220, 'X', $default, $obj->request->isSecure());;
}

    if(!empty($menu->title) && strpos($menu->getCurrentMenu()[2],'manage-comments.php') !== false){
    echo '<div class="zetx"><img class="avatar a" src="' . $url . '" alt="' .
    $obj->author . '" width="' . $size . '" height="' . $size . '" />
    <img class="avatar b" src="' . self::letter_avatar($obj->author) . '" alt="' .
    $obj->author . '" width="' . $size . '" height="' . $size . '" /></div>';
    }else{
    echo '<img class="avatar" loading="lazy" src="' . $url . '" alt="' .
        $obj->author . '" width="' . $size . '" height="' . $size . '" />';
    }



}




//评论网址超时屏蔽
public static function urlfilter($val, $obj){
$plugin = Options::alloc()->plugin('NewAdmin');
if($plugin->urlfilter>1){
$num=($plugin->urlfilter-1)*15;
// 15*n天前的时间戳
$fifteenDaysAgo = time() - ($num * 86400);
 
// 判断是否是15天前
if ($val['created'] < $fifteenDaysAgo) {
    $val['url']='';//清空url 
}
}elseif($plugin->urlfilter==1){//1为隐藏所有url
    $val['url']='';//清空url 
}
    return $val;
}


private  static function mailtx($mail,$type="mm"){
\Widget\Options::alloc()->to($options);
$request = $options->request;
$mail=strtolower($mail);$qq=str_replace('@qq.com','',$mail);
if(strstr($mail,"qq.com")&&is_numeric($qq)&&strlen($qq)<11&&strlen($qq)>4){
  return 'https://q2.qlogo.cn/headimg_dl?dst_uin='.$qq.'&spec=640';
}else{
  return Common::gravatarUrl($mail, 220, 'X', $type, $request->isSecure());
}
}
/**
 * 首字母头像（修复Firefox文字居中+背景色消失问题）
 * @param $text
 * @return string
 */
private static function letter_avatar($text)
{
    $total = unpack('L', hash('adler32', $text, true))[1];
    $hue = $total % 360;
    list($r, $g, $b) = self::hsv2rgb($hue / 360, 0.3, 0.9);
    $bg = "rgb({$r},{$g},{$b})";
    $color = "#ffffff";
    $first = mb_strtoupper(mb_substr($text, 0, 1));
    
    // 关键修复：使用单行字符串拼接SVG，避免换行/空格导致解析异常
    $svgContent = '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="100" width="100"><rect fill="'.$bg.'" x="0" y="0" width="100" height="100"></rect><text x="50" y="55" font-size="50" fill="'.$color.'" text-anchor="middle" dominant-baseline="middle" alignment-baseline="central">'.$first.'</text></svg>';
    
    // base64编码前确保字符串无特殊字符
    $src = base64_encode(trim($svgContent));
    
    return 'data:image/svg+xml;base64,' . $src;
}

private static function hsv2rgb($h, $s, $v)
{
    $r = $g = $b = 0;
    $i = floor($h * 6);
    $f = $h * 6 - $i;
    $p = $v * (1 - $s);
    $q = $v * (1 - $f * $s);
    $t = $v * (1 - (1 - $f) * $s);
    switch ($i % 6) {
        case 0:
            $r = $v;
            $g = $t;
            $b = $p;
            break;
        case 1:
            $r = $q;
            $g = $v;
            $b = $p;
            break;
        case 2:
            $r = $p;
            $g = $v;
            $b = $t;
            break;
        case 3:
            $r = $p;
            $g = $q;
            $b = $v;
            break;
        case 4:
            $r = $t;
            $g = $p;
            $b = $v;
            break;
        case 5:
            $r = $v;
            $g = $p;
            $b = $q;
            break;
    }
    return [
        floor($r * 255),
        floor($g * 255),
        floor($b * 255)
    ];
}
    /**
     * 输出父级菜单
     */
    public  static function output()
    {
        $currentParent = 1;$currentChild = 0;
        \Widget\Menu::alloc()->to($menu);
        \Widget\Options::alloc()->to($options);
        \Widget\User::alloc()->to($user);
        $icons=$options->pluginUrl.'/NewAdmin/assets/img/icons.svg?2'; 
        $group=$user->group;

        $class = 'focus'; $childClass = 'focus';
        $parentNodes = [null, _t('控制台'), _t('撰写'), _t('管理'), _t('设置')];

        $childNodes = [
            [
                [_t('登录'), _t('登录到%s', $options->title), 'login.php', 'visitor'],
                [_t('注册'), _t('注册到%s', $options->title), 'register.php', 'visitor']
            ],
            [
                [_t('概要'), _t('网站概要'), 'index.php', 'subscriber'],
                [_t('个人设置'), _t('个人设置'), 'profile.php', 'subscriber'],
                [_t('插件'), _t('插件管理'), 'plugins.php', 'administrator'],
                [[Config::class, 'getMenuTitle'], [Config::class, 'getMenuTitle'], 'options-plugin.php?config=', 'administrator', true],
                [_t('外观'), _t('网站外观'), 'themes.php', 'administrator'],
                [[Files::class, 'getMenuTitle'], [Files::class, 'getMenuTitle'], 'theme-editor.php', 'administrator', true],
                [_t('设置外观'), _t('设置外观'), 'options-theme.php', 'administrator', true],
                [_t('备份'), _t('备份'), 'backup.php', 'administrator'],
                [_t('升级'), _t('升级程序'), 'upgrade.php', 'administrator', true],
                [_t('欢迎'), _t('欢迎使用'), 'welcome.php', 'subscriber', true]
            ],
            [
                [_t('撰写文章'), _t('撰写新文章'), 'write-post.php', 'contributor'],
                [[PostEdit::class, 'getMenuTitle'], [PostEdit::class, 'getMenuTitle'], 'write-post.php?cid=', 'contributor', true],
                [_t('创建页面'), _t('创建新页面'), 'write-page.php', 'editor'],
                [[PageEdit::class, 'getMenuTitle'], [PageEdit::class, 'getMenuTitle'], 'write-page.php?cid=', 'editor', true],
            ],
            [
                [_t('文章'), _t('管理文章'), 'manage-posts.php', 'contributor', false, 'write-post.php'],
                [[PostAdmin::class, 'getMenuTitle'], [PostAdmin::class, 'getMenuTitle'], 'manage-posts.php?uid=', 'contributor', true],
                [_t('独立页面'), _t('管理独立页面'), 'manage-pages.php', 'editor', false, 'write-page.php'],
                [_t('评论'), _t('管理评论'), 'manage-comments.php', 'contributor'],
                [[CommentsAdmin::class, 'getMenuTitle'], [CommentsAdmin::class, 'getMenuTitle'], 'manage-comments.php?cid=', 'contributor', true],
                [_t('分类'), _t('管理分类'), 'manage-categories.php', 'editor', false, 'category.php'],
                [_t('新增分类'), _t('新增分类'), 'category.php', 'editor', true],
                [[CategoryAdmin::class, 'getMenuTitle'], [CategoryAdmin::class, 'getMenuTitle'], 'manage-categories.php?parent=', 'editor', true, [CategoryAdmin::class, 'getAddLink']],
                [[CategoryEdit::class, 'getMenuTitle'], [CategoryEdit::class, 'getMenuTitle'], 'category.php?mid=', 'editor', true],
                [[CategoryEdit::class, 'getMenuTitle'], [CategoryEdit::class, 'getMenuTitle'], 'category.php?parent=', 'editor', true],
                [_t('标签'), _t('管理标签'), 'manage-tags.php', 'editor'],
                [[TagAdmin::class, 'getMenuTitle'], [TagAdmin::class, 'getMenuTitle'], 'manage-tags.php?mid=', 'editor', true],
                [_t('文件'), _t('管理文件'), 'manage-medias.php', 'editor'],
                [[AttachmentEdit::class, 'getMenuTitle'], [AttachmentEdit::class, 'getMenuTitle'], 'media.php?cid=', 'contributor', true],
                [_t('用户'), _t('管理用户'), 'manage-users.php', 'administrator', false, 'user.php'],
                [_t('新增用户'), _t('新增用户'), 'user.php', 'administrator', true],
                [[UsersEdit::class, 'getMenuTitle'], [UsersEdit::class, 'getMenuTitle'], 'user.php?uid=', 'administrator', true],
            ],
            [
                [_t('基本'), _t('基本设置'), 'options-general.php', 'administrator'],
                [_t('评论'), _t('评论设置'), 'options-discussion.php', 'administrator'],
                [_t('阅读'), _t('阅读设置'), 'options-reading.php', 'administrator'],
                [_t('永久链接'), _t('永久链接设置'), 'options-permalink.php', 'administrator'],
            ]
        ];

        /** 获取扩展菜单 */
        $Version=str_replace('.', '', $options->Version);
        if($Version>=130){
        $panelTable = $options->panelTable;
        }else{
        $panelTable = unserialize($options->panelTable);
        }
        $extendingParentMenu = empty($panelTable['parent']) ? [] : $panelTable['parent'];
        $extendingChildMenu = empty($panelTable['child']) ? [] : $panelTable['child'];
        $currentUrl = $menu->request->getRequestUrl();
        $adminUrl = $options->adminUrl;
        $menu = [];
        $defaultChildNode = [null, null, null, 'administrator', false, null];

        $currentUrlParts = parse_url($currentUrl);
        $currentUrlParams = [];
        if (!empty($currentUrlParts['query'])) {
            parse_str($currentUrlParts['query'], $currentUrlParams);
        }

        if ('/' == $currentUrlParts['path'][strlen($currentUrlParts['path']) - 1]) {
            $currentUrlParts['path'] .= 'index.php';
        }

        foreach ($extendingParentMenu as $key => $val) {
            $parentNodes[10 + $key] = $val;
        }

        foreach ($extendingChildMenu as $key => $val) {
            $childNodes[$key] = array_merge($childNodes[$key] ?? [], $val);
        }

        foreach ($parentNodes as $key => $parentNode) {
            // this is a simple struct than before
            $children = [];
            $showedChildrenCount = 0;
            $firstUrl = null;

            foreach ($childNodes[$key] as $inKey => $childNode) {
                // magic merge
                $childNode += $defaultChildNode;
                [$name, $title, $url, $access] = $childNode;

                $hidden = $childNode[4] ?? false;
                $addLink = $childNode[5] ?? null;

                // 保存最原始的hidden信息
                $orgHidden = $hidden;

                // parse url
                $url = Common::url($url, $adminUrl);

                // compare url
                $urlParts = parse_url($url);
                $urlParams = [];
                if (!empty($urlParts['query'])) {
                    parse_str($urlParts['query'], $urlParams);
                }

                $validate = true;
                if ($urlParts['path'] != $currentUrlParts['path']) {
                    $validate = false;
                } else {
                    foreach ($urlParams as $paramName => $paramValue) {
                        if (!isset($currentUrlParams[$paramName])) {
                            $validate = false;
                            break;
                        }
                    }
                }

                if (
                    $validate
                    && basename($urlParts['path']) == 'extending.php'
                    && !empty($currentUrlParams['panel']) && !empty($urlParams['panel'])
                    && $urlParams['panel'] != $currentUrlParams['panel']
                ) {
                    $validate = false;
                }

                if ($hidden && $validate) {
                    $hidden = false;
                }

                if (!$hidden && !$user->pass($access, true)) {
                    $hidden = true;
                }

                if (!$hidden) {
                    $showedChildrenCount++;

                    if (empty($firstUrl)) {
                        $firstUrl = $url;
                    }

                    if (is_array($name)) {
                        [$widget, $method] = $name;
                        $name = Widget::widget($widget)->$method();
                    }

                    if (is_array($title)) {
                        [$widget, $method] = $title;
                        $title = Widget::widget($widget)->$method();
                    }

                    if (is_array($addLink)) {
                        [$widget, $method] = $addLink;
                        $addLink = Widget::widget($widget)->$method();
                    }
                }

                if ($validate) {
                    if ('visitor' != $access) {
                        $user->pass($access);
                    }

                    $currentParent = $key;
                    $currentChild = $inKey;
                    $title = $title;
                    $addLink = $addLink ? Common::url($addLink, $adminUrl) : null;
                }

                $children[$inKey] = [
                    $name,
                    $title,
                    $url,
                    $access,
                    $hidden,
                    $addLink,
                    $orgHidden
                ];
            }

            $menu[$key] = [$parentNode, $showedChildrenCount > 0, $firstUrl, $children];
        }
        $currentUrl = Common::safeUrl($currentUrl);
        
        
        
        $xiasvg='<svg class="menusvg" :class="{\'rotate\':collapseopen}" aria-hidden="true"><use xlink:href="'.$icons.'#icon-xia"></use></svg>';
        $icon=['pingtai','bianji','qiyeguanli','shezhi'];
        $tubiao = 'daichuli';
        $menuhtml='<li class="menua"><a class="hang" href="'.$adminUrl.'"><svg class="icon" aria-hidden="true"><use xlink:href="'.$icons.'#icon-shouye"></use></svg>概要</a></li>';
        $num=0;

        foreach ($menu as $key => $node) {
            if (!$node[1] || !$key) {
                continue;
            }

             $k=4;$open='false';
             if($group=='subscriber'){$k=1;}
             if($group=='contributor'||$group=='editor'){$k=3;}
             if($num<$k){$tubiao = $icon[$num];}$num++;
             if($key == $currentParent&&$currentUrl!=$adminUrl){$open='true';}
             
            if(strpos($node[2],'TePass') !== false){
                 $tubiao="duizhang";
            if(strpos($node[2],'center') !== false){
                 $tubiao="huiyuanka";
             }
             }
             
            $menuhtml=$menuhtml. '<li class="menu-li" x-data="{ collapseopen: '.$open.'}"><button @click="collapseopen=!collapseopen"><div class="hang"><svg class="icon" aria-hidden="true"><use xlink:href="'.$icons.'#icon-'.$tubiao.'"></use></svg><span>'.$node[0].'</span></div><span>'.$xiasvg.'</span></button><ul class="sonmenu" :class="{\'open\':collapseopen}">';

            $last = 0;
            foreach ($node[3] as $inKey => $inNode) {
                if (!$inNode[4]) {
                    $last = $inKey;
                }
            }

            foreach ($node[3] as $inKey => $inNode) {
                if ($inNode[4]||($inKey==0&&$num==1)) {
                    continue;
                }

                $classes = [];
                if ($key == $currentParent && $inKey == $currentChild) {
                    $classes[] = $childClass;
                   
                } elseif ($inNode[6]) {
                    continue;
                }

                if ($inKey == $last) {
                    $classes[] = 'last';
                }

                $menuhtml=$menuhtml. "<li" . (!empty($classes) ? ' class="' . implode(' ', $classes) . '"' : null) . "><a href=\""
                    . ($key == $currentParent && $inKey == $currentChild ? $currentUrl : $inNode[2])
                    . "\">{$inNode[0]}</a></li>";
            }

            $menuhtml=$menuhtml. "</ul></li>";
        }
        return $menuhtml;
    }
}