系统消息

跳转到导航 跳转到搜索
此处列出了MediaWiki命名空间下所有可用的系统消息。 如果想为MediaWiki的本地化贡献翻译,请访问MediaWiki本地化和translatewiki.net。
系统消息
首页上一页下一页末页
名称 默认消息文本
当前消息文本
changecontentmodel-legend (留言) (翻译) 更改内容模型
changecontentmodel-model-label (留言) (翻译) 新的内容模型:
changecontentmodel-nodirectediting (留言) (翻译) $1内容模型不支持直接编辑
changecontentmodel-reason-label (留言) (翻译) 原因:
changecontentmodel-submit (留言) (翻译) 更改
changecontentmodel-success-text (留言) (翻译) [[:$1]]的内容类型已更改。
changecontentmodel-success-title (留言) (翻译) 内容模型已更改
changecontentmodel-title-label (留言) (翻译) 页面标题:
changecredentials (留言) (翻译) 更改凭据
changecredentials-invalidsubpage (留言) (翻译) $1不是有效的凭据类型。
changecredentials-submit (留言) (翻译) 更改凭据
changecredentials-success (留言) (翻译) 您的凭据已被更改。
changed (留言) (翻译) 更改
changeemail (留言) (翻译) 更改或移除电子邮件地址
changeemail-header (留言) (翻译) 完成此表单以更改您的电子邮件地址。如果您希望从您的账户中移除任何关联的电子邮件地址,请在提交表单时将新电子邮件地址留空。
changeemail-maxlength (留言) (翻译) 你的电子邮件地址最多应包含255个字符。
changeemail-newemail (留言) (翻译) 新的电子邮件地址:
changeemail-newemail-help (留言) (翻译) 如果您希望移除您的电子邮件地址的话此字段应留空。如果电子邮件地址被移除,您将无法重置忘记的密码,并将不会接收来自此wiki的电子邮件。
changeemail-no-info (留言) (翻译) 您必须登录以直接访问本页。
changeemail-nochange (留言) (翻译) 请输入一个不同的新的电子邮件地址。
changeemail-none (留言) (翻译) (无)
changeemail-oldemail (留言) (翻译) 当前电子邮件地址:
changeemail-password (留言) (翻译) 您的{{SITENAME}}密码:
changeemail-submit (留言) (翻译) 更改电子邮件地址
changeemail-summary (留言) (翻译)  
changeemail-throttled (留言) (翻译) 您最近尝试了太多次登录。 请等待$1后再试。
changepassword (留言) (翻译) 更改密码
changepassword-success (留言) (翻译) 您已经修改了您的密码!
changepassword-summary (留言) (翻译)  
changepassword-throttled (留言) (翻译) 您最近尝试了太多次登录。 请等待$1后再试。
changeslist-nocomment (留言) (翻译) 无编辑摘要
checkbox-all (留言) (翻译) 全选
checkbox-invert (留言) (翻译) 反选
checkbox-none (留言) (翻译) 全不选
checkbox-select (留言) (翻译) 选择:$1
clearyourcache (留言) (翻译) <strong>注意:</strong>在发布之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。 * <strong>Firefox或Safari:</strong>按住<em>Shift</em>的同时单击<em>刷新</em>,或按<em>Ctrl-F5</em>或<em>Ctrl-R</em>(Mac为<em>⌘-R</em>) * <strong>Google Chrome:</strong>按<em>Ctrl-Shift-R</em>(Mac为<em>⌘-Shift-R</em>) * <strong>Internet Explorer或Edge:</strong>按住<em>Ctrl</em>的同时单击<em>刷新</em>,或按<em>Ctrl-F5</em> * <strong>Opera:</strong>按 <em>Ctrl-F5</em>。
collabpad (留言) (翻译) 协作板
collabpad-doctitle (留言) (翻译) 协作板:$1
collabpad-import-subtitle (留言) (翻译) 导入自$1
collapsible-collapse (留言) (翻译) 折叠
collapsible-expand (留言) (翻译) 展开
colon-separator (留言) (翻译) :​
comma-separator (留言) (翻译) 、​
common.css (留言) (翻译) /* 这里放置的CSS将应用于所有皮肤 */
/* ===================================================================== 帝鹰维基 · 全站样式 v18(v17 基础上:全部内容框高宽随文字量自适应、排版防拥挤) 皮肤:不更换,直接在原版 Vector 皮肤上叠加本样式 ===================================================================== ★ 所有可改参数都集中在下面 :root 里,只改冒号后的数值/色值即可。 ===================================================================== */ :root{ /* ---- ① 顶部红色导航区 ---- */ --dy-nav-bg:#8e1a12; /* ★★ 顶部导航栏红色基准(改这里全局换色) ★★ */ --dy-nav-height:52px; /* 顶部主导航栏高度 */ --dy-nav-line:#0d0d0d; /* 导航栏下方那条细黑线的颜色 */ --dy-nav-line-w:2px; /* 细黑线粗细 */ /* ---- ② 功能面板(页面/讨论/阅读/编辑/源代码/查看历史/星标/搜索框/更多 所在条) ---- */ --dy-tabstrip:62px; /* 功能面板高度 */ --dy-panel-bg:#1f2733; /* ★★ 面板底色:深蓝黑实色(与新旗帜图底色一致 → 旗帜与面板之间不再出现竖向分界线) ★★ */ --dy-panel-decor:rgba(255,255,255,.05); /* 面板装饰(艺术文字/几何线)透明度,越调小越低调 */ --dy-nav-ink:#ffffff; /* 面板内文字颜色(白) */ --dy-nav-hover:#f5d9a8; /* 悬浮/选中高亮文字色(浅金) */ --dy-nav-hover-bg:rgba(255,255,255,.16); /* 悬浮高亮底色 */ /* ---- ③ 侧边栏:深暗军装橄榄绿 ---- */ --dy-side-olive:#2c3226; /* ★★ 侧边栏整体背景色(军装橄榄绿,可自行调) ★★ */ --dy-side-ink:#eceada; /* 侧边栏链接文字颜色(米白,保证可读) */ --dy-side-head:#c6cbae; /* 侧边栏分组标题颜色(浅橄榄) */ --dy-side-hover:#e6d290; /* 侧边栏链接悬浮颜色(金) */ /* ---- ④ 全局 ---- */ --dy-bg:#ffffff; /* ★★ 右侧主内容区/全站闲置背景:纯白 ★★ */ --dy-ink:#23281f; /* 全局正文字体颜色 */ --dy-sub:#6a6f62; /* 次要文字颜色 */ --dy-font-size:15px; /* 全局字号 */ --dy-content-max:980px; /* 主内容区最大宽度 */ /* ---- ⑤ 主题色(主页横幅/板块标题栏,沿用帝鹰绿金) ---- */ --dy-green:#262b21; /* 主深绿(横幅、板块标题栏底色) */ --dy-green-2:#3d4835; /* 渐变辅助绿 */ --dy-gold:#e6d290; /* 金色 */ --dy-gold-d:#b8995a; /* 深金 */ /* ---- ⑥ 卡片 ---- */ --dy-card-bg:#ffffff; /* 卡片外框底色 */ --dy-card-inner:#e3f2ef; /* ★★ 公告框/成员名片 内容区底色:浅青色(原浅灰 #f0f0ed 已换) ★★ */ --dy-card-border:1px solid #ddd8c8; /* 卡片边框 */ --dy-card-radius:10px; /* 卡片圆角 */ --dy-card-shadow:0 1px 5px rgba(38,43,33,.07); /* 卡片阴影 */ --dy-gap:14px; /* 卡片/板块间距 */ /* ---- ⑦ 侧边栏宽度 / 旗帜 ---- */ --dy-sidebar-width:10.5em; /* 侧边栏整体宽度 */ --dy-logo-size:50px; /* 旗帜 logo 尺寸 */ /* ---- ⑧ 黑色竖向分隔线(侧栏 ↔ 主内容区) ---- */ --dy-divider-color:#0d0d0d; /* 分隔线颜色(当前未使用,留作恢复备参) */ --dy-divider-width:8px; /* 分隔线粗细(当前未使用,留作恢复备参) */ } /* ===================================================================== 0. 顶部红色导航栏(#dy-topnav 由 Common.js 注入)+ 底部细黑线 ===================================================================== */ #dy-topnav{position:fixed;top:0;left:0;right:0;z-index:200; height:var(--dy-nav-height);background:var(--dy-nav-bg); border-bottom:var(--dy-nav-line-w) solid var(--dy-nav-line); /* ★ 导航下方细黑线 */ box-sizing:content-box; /* 黑线画在 52px 高度之外,不挤内容 */ display:flex;align-items:center;justify-content:center; gap:38px;box-shadow:0 2px 8px rgba(20,10,5,.35);} #dy-topnav a{color:var(--dy-nav-ink);font-size:14.5px;font-weight:600; letter-spacing:2px;padding:5px 16px;border-radius:6px; transition:background .15s,color .15s;} #dy-topnav a:hover{color:var(--dy-nav-hover);background:var(--dy-nav-hover-bg);} /* ===================================================================== 1. 功能面板:红色导航下方的暗色横条(原生按钮 + 搜索框 + 更多 全在里面) ★ 底色 = 低透明度浅黑 --dy-panel-bg;空白处有低调装饰: ::before = 居中艺术文字水印;::after = 右侧鹰翼状几何细线纹样。 装饰层 pointer-events:none 且透明度极低,绝不遮挡按钮/搜索框/文字。 ===================================================================== */ #mw-page-base{height:var(--dy-tabstrip) !important; background:var(--dy-panel-bg) !important; /* ★ 面板暗色底(原纯红改暗黑) */ position:relative;overflow:hidden;} #mw-page-base::before{content:'IMPERIAL EAGLE · 帝鹰网联 · IEW'; position:absolute;left:0;right:0;top:50%;transform:translateY(-50%); text-align:center;font-size:19px;letter-spacing:14px;white-space:nowrap; color:var(--dy-panel-decor);pointer-events:none;} /* 艺术文字水印(透明度 :root 可调) */ #mw-page-base::after{content:'';position:absolute;right:10px;top:50%; width:150px;height:40px;transform:translateY(-50%); background:repeating-linear-gradient(118deg,var(--dy-panel-decor) 0 1px,transparent 1px 8px); -webkit-mask:radial-gradient(ellipse 100% 100% at 100% 50%,#000 30%,transparent 78%); mask:radial-gradient(ellipse 100% 100% at 100% 50%,#000 30%,transparent 78%); pointer-events:none;} /* 鹰翼状几何细线(右端渐隐) */ /* 面板占位等高 + 负边距抵消 → 内容区紧贴面板底部,无多余留白 */ #mw-head-base{height:var(--dy-tabstrip) !important; margin-top:calc(-1 * var(--dy-tabstrip)) !important;} #mw-head{top:var(--dy-nav-height) !important;height:var(--dy-tabstrip);box-sizing:border-box; position:absolute;left:0;right:0;z-index:2;} /* 按钮层压在装饰层之上 */ /* 左右两组(含搜索框)flex 垂直居中,与面板同高严丝合缝 */ #left-navigation,#right-navigation{margin-top:0 !important; height:var(--dy-tabstrip);box-sizing:border-box; display:flex;align-items:center;} #left-navigation > *,#right-navigation > *{margin-top:0 !important;} #left-navigation{margin-left:calc(var(--dy-sidebar-width) + 28px) !important;} /* ★ 页面/讨论整组:从侧栏右缘再右移 28px(改数字即调距离) */ /* ★ 按钮排布(本次定稿):整组按钮从右侧搜索框方向向左铺开, 页面/讨论 紧跟在 阅读 左边;完全远离左侧「帝鹰维基」标题图片 */ #mw-head{display:flex;align-items:center;} #left-navigation,#right-navigation{float:none !important;} #left-navigation{margin-left:auto !important; /* ★ 左组(页面/讨论)推到面板右端 */ margin-right:14px;} /* 与「阅读」组之间留一档间距 */ #right-navigation{flex:0 0 auto;} /* 右组不再拉伸,紧贴搜索框 */ #right-navigation > #p-search{margin-left:auto;} /* 搜索框固定最右(右组内兜底) */ /* —— 原生按钮(1.39 类名 .vector-menu-tabs):白字适配暗底 —— */ .vector-menu-tabs{background-image:none !important;} .vector-menu-tabs .vector-menu-content-list li{ background-image:none !important;background-color:transparent !important;} .vector-menu-tabs .vector-menu-content-list li a{color:#ffffff !important;} .vector-menu-tabs .vector-menu-content-list li.selected a, .vector-menu-tabs .vector-menu-content-list li.selected a:visited{color:var(--dy-nav-hover) !important;} .vector-menu-tabs .vector-menu-content-list li.new a, .vector-menu-tabs .vector-menu-content-list li.new a:visited{color:#ffd9d0 !important;} .vector-menu-tabs .vector-menu-content-list li a:hover{background:var(--dy-nav-hover-bg);border-radius:4px;} /* 下拉菜单(变体/更多):标题白字,展开面板白底黑字保证可读 */ .vector-menu-dropdown .vector-menu-heading{color:#ffffff;} .vector-menu-dropdown .vector-menu-content{background:#ffffff;} .vector-menu-dropdown .vector-menu-content li a{color:#333333 !important;} /* 搜索框:紧凑圆角融进暗面板 */ #p-search form{margin:0;} #p-search input[type="search"],#simpleSearch{border-radius:6px;} /* ===================================================================== 2. 右上角用户登录信息外移(用户名/讨论/参数设置/监视列表/贡献/退出) ★ 从红色导航内部移到:红色导航下方、白色主内容区右上空白处。 内容区顶部同步加内边距,保证不压正文、卡片、搜索框。 ===================================================================== */ #p-personal{top:calc(var(--dy-nav-height) + var(--dy-tabstrip) + 10px) !important; right:26px !important;z-index:220;} #p-personal li a{color:#5a5548;font-size:12.5px;} /* 深灰字,白底上清晰可点 */ #p-personal li a:hover{color:var(--dy-nav-bg);} /* 悬浮变红,呼应顶栏 */ /* ===================================================================== 3. 侧边栏:深暗军装橄榄绿整体背景 + 顶部红色旗帜块 + 厚黑分隔线 ★ 背景实现:body::before 画一条固定全高的橄榄绿竖列(宽度=侧栏宽), 菜单滚动时绿色始终铺满左列;文字色米白保证可读。 ===================================================================== */ body::before{content:'';position:fixed;left:0;top:var(--dy-nav-height);bottom:0; width:calc(var(--dy-sidebar-width));background:var(--dy-side-olive);z-index:0;} #mw-panel{top:calc(var(--dy-nav-height) + var(--dy-nav-line-w)) !important; width:var(--dy-sidebar-width);padding-left:0; background:transparent;border:0;box-shadow:none;} /* 顶部旗帜区块:本次改为「旗帜图片铺满整个板块」 ★ 移除原来的红色板块底色(图片自己铺满即是背景); 保留底部 2px 黑线(容器边框美感); 板块高度仍 = --dy-tabstrip,与上方红色导航/侧栏宽度严格对齐。 */ #p-logo{background:transparent; height:var(--dy-tabstrip);box-sizing:border-box; display:flex;align-items:center;justify-content:center; padding:0;margin:0;border-bottom:2px solid var(--dy-nav-line);} /* 旗帜图铺满容器:宽高 100% + cover(等比填满、不变形不拉伸、不溢出, 多余部分居中裁掉);想改回「完整显示留白」就把 cover 改成 contain。 */ #p-logo .mw-wiki-logo{margin:0; width:100%;height:100%; background-size:cover !important;background-position:center !important;} /* 侧边栏文字配色:深底上米白可读、悬浮变金 */ #mw-panel h3{font-size:12.5px;letter-spacing:2px;color:var(--dy-side-head);} #mw-panel .vector-menu-portal{margin:0;padding:10px 12px; border-bottom:1px solid rgba(255,255,255,.08);} #mw-panel .vector-menu-content-list a, #mw-panel .vector-menu-content-list a:visited{color:var(--dy-side-ink);} #mw-panel .vector-menu-content-list a:hover{color:var(--dy-side-hover);} #mw-panel .vector-menu-content-list a.new, #mw-panel .vector-menu-content-list a.new:visited{color:#f2b3a4;} /* 未创建词条浅红 */ /* ===================================================================== 4. 左右两区交界:本次按要求【移除】竖向黑色分隔线 ★ 不再画任何分割线;仅保留 margin-left = 侧栏宽度, 保证侧边栏与主内容区边缘对齐、宽度衔接规整。 (若以后想恢复分隔线,把 border-left 那行加回来即可。) ===================================================================== */ #content{border-left:0 !important; /* ★ 已删除竖向黑色分隔线 */ margin-left:var(--dy-sidebar-width) !important; /* 边缘对齐:内容区紧接侧栏 */ padding-top:3.4em !important; /* 顶部加高:给外移的用户链接让位,不压正文 */ background:transparent;border-top:0;border-right:0;border-bottom:0;box-shadow:none;} /* ===================================================================== 5. 全局布局(纯白底)+ 侧边栏菜单 ===================================================================== */ body{padding-top:calc(var(--dy-nav-height) + var(--dy-nav-line-w)); background:var(--dy-bg);color:var(--dy-ink);font-size:var(--dy-font-size);} .mw-body-content{max-width:var(--dy-content-max);} /* ===================================================================== 6. 主页顶部横幅(帝鹰绿金,沿用不动) ===================================================================== */ .dy-hero{display:flex;align-items:center;justify-content:space-between;gap:18px; background:linear-gradient(135deg,var(--dy-green) 0%,var(--dy-green-2) 78%,#57634b 100%); border-radius:var(--dy-card-radius);padding:26px 30px; box-shadow:0 3px 14px rgba(38,43,33,.22);margin-bottom:var(--dy-gap);} .dy-hero-title{font-size:30px;font-weight:800;letter-spacing:6px;color:var(--dy-gold); font-family:"STZhongsong","SimSun",serif;margin-bottom:8px;} .dy-hero-en{font-family:Arial,"Segoe UI",sans-serif;font-weight:400; letter-spacing:3px;margin-left:10px;opacity:.92;} .dy-hero-desc{color:#d9dcc8;font-size:13.5px;line-height:1.9;max-width:640px;} .dy-hero-desc b{color:var(--dy-gold);font-size:16px;} .dy-hero-logo img{border-radius:12px;border:2px solid rgba(230,210,144,.55); box-shadow:0 2px 10px rgba(0,0,0,.3);display:block;} /* ===================================================================== 7. 公告栏 + 卡片:内容区底色改浅灰(黑标题条/边框/头像/排版全不变) ===================================================================== */ .dy-announce{background:var(--dy-card-bg);border:var(--dy-card-border); border-radius:var(--dy-card-radius);overflow:hidden; box-shadow:var(--dy-card-shadow);margin-bottom:var(--dy-gap);} .dy-announce-h{background:var(--dy-green);color:var(--dy-gold);text-align:center; font-weight:700;letter-spacing:8px;padding:8px 0;font-size:15px;} .dy-announce-b{padding:18px 22px 24px;line-height:2.1;color:var(--dy-ink); background:var(--dy-card-inner);height:auto; /* ★ 高度不固定:随文字多少自动撑开 */ word-break:break-word;overflow-wrap:anywhere;} /* ★ 长句自动换行,文字不挤不溢出 */ .dy-announce-b p{margin:0 0 10px;} /* ===================================================================== 8. 大板块容器 + 「社群典章与纪事」链接小卡片化 ★ 每个链接条目 = 独立小卡片按钮:背景块 + 圆角 + 内边距 + 细边框, 悬浮柔和抬升反馈;链接、顺序、分组、双列结构全部保留。 ===================================================================== */ .dy-section{background:var(--dy-card-bg);border:var(--dy-card-border); border-radius:var(--dy-card-radius);overflow:hidden; box-shadow:var(--dy-card-shadow);margin-bottom:var(--dy-gap);} .dy-sec-bar{background:var(--dy-green);color:var(--dy-gold);text-align:center; font-weight:700;letter-spacing:6px;padding:8px 0;font-size:15px;} .dy-sec-note{font-size:12px;color:#8a8578;text-align:center; line-height:1.9;padding:10px 18px 0;margin:0;} .dy-sec-more{text-align:center;color:var(--dy-sub);font-size:12.5px;padding:10px 0 14px;} .dy-expose.dy-grid2{display:grid;grid-template-columns:1fr 1fr;gap:var(--dy-gap);} /* —— 典章纪事:双列小卡片按钮 —— */ .dy-lines2{display:grid;grid-template-columns:1fr 1fr;gap:10px 14px;} .dy-lines2 .dy-line a{display:block;background:#eef7f5; /* ★ 典章小卡片底色同步浅青 */ border:1px solid #ddd9cc;border-radius:8px;padding:9px 14px; color:#3a3a35;font-size:14px;text-align:center; transition:background .15s,color .15s,box-shadow .15s,transform .15s;} .dy-lines2 .dy-line a:visited{color:#3a3a35;} .dy-lines2 .dy-line a:hover{background:#ffffff;border-color:var(--dy-nav-bg); color:var(--dy-nav-bg);box-shadow:0 2px 10px rgba(0,0,0,.08);transform:translateY(-1px);} .dy-lines2 .dy-line a.new,.dy-lines2 .dy-line a.new:visited{color:#b3261e;} /* 未创建词条保持红名 */ /* ===================================================================== 9. 人物档案横卡:内容区底色浅灰(其余样式不动) ===================================================================== */ .dy-expose{padding:16px 18px 6px;display:flex;flex-direction:column;gap:var(--dy-gap);} .dy-pcard{display:flex;gap:16px;align-items:flex-start;padding:14px 16px; border:var(--dy-card-border);border-radius:8px;background:var(--dy-card-inner); height:auto;min-height:0;} /* ★ 名片高度随简介文字自动伸缩,不固定 */ .dy-pcard-ava{flex:0 0 76px;width:76px;height:76px;} .dy-pcard-ava img{width:76px;height:76px;object-fit:cover;border-radius:50%; border:2px solid var(--dy-gold-d);box-shadow:0 2px 6px rgba(38,43,33,.18);} .dy-pcard-ph{display:flex;width:76px;height:76px;border-radius:50%; align-items:center;justify-content:center;background:var(--dy-green); color:var(--dy-gold);font-size:30px;font-weight:700;border:2px solid var(--dy-gold-d);} .dy-pcard-main{flex:1;min-width:0;} /* 文字列占满剩余宽度,宽随容器自适应 */ .dy-pcard-name{font-size:17px;font-weight:700;margin-bottom:4px;} .dy-pcard-name a{color:var(--dy-green-2);} .dy-pcard-tag{display:inline-block;background:#f1edda;color:#8a7434; border:1px solid #e0d6ac;border-radius:999px;padding:1px 12px; font-size:12px;margin-bottom:6px;} .dy-pcard-desc{color:var(--dy-sub);font-size:13.5px;line-height:2.0; /* 行距加大防拥挤 */ word-break:break-word;overflow-wrap:anywhere;} /* 长句自动换行 */ /* ===================================================================== 10. 侧边栏模块:♪ 帝鹰电台 + 💬 帝鹰聊天室(Common.js 注入,军装绿主题) ===================================================================== */ #dy-radio,#dy-chat{margin:10px 10px 2px;background:#232819; border:1px solid rgba(230,210,144,.28);border-radius:10px; padding:10px 10px 11px;color:var(--dy-gold);} #dy-radio .dy-mod-h,#dy-chat .dy-mod-h{font-size:12.5px;letter-spacing:2px; font-weight:700;margin-bottom:7px;} #dy-r-title{font-size:12px;color:#f2f1e4;min-height:18px;margin-bottom:6px; overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} #dy-r-ctl{display:flex;gap:5px;} #dy-r-ctl button,#dy-chat-open{background:#3a4232;color:var(--dy-gold); border:1px solid rgba(230,210,144,.35);border-radius:6px; padding:3px 10px;font-size:13px;cursor:pointer;font-family:inherit;} #dy-chat-open{display:block;width:100%;padding:6px 0;text-align:center;} #dy-r-ctl button:hover,#dy-chat-open:hover{background:#4a5440;color:#f5e6b8;} /* 聊天室弹层(点击「进入聊天室」出现,内置 /chat/ 页面 iframe) */ #dy-chat-ov{position:fixed;inset:0;z-index:500;background:rgba(10,12,8,.72); display:flex;align-items:center;justify-content:center;} #dy-chat-ov[hidden]{display:none;} .dy-chat-frame{width:min(960px,96vw);height:88vh;background:#fff; border-radius:12px;overflow:hidden;display:flex;flex-direction:column; box-shadow:0 10px 40px rgba(0,0,0,.5);} .dy-chat-bar{background:var(--dy-green);color:var(--dy-gold); padding:6px 12px;font-size:13px;display:flex; justify-content:space-between;align-items:center;letter-spacing:2px;} #dy-chat-close{background:none;border:1px solid rgba(230,210,144,.4); color:var(--dy-gold);border-radius:6px;padding:2px 10px;cursor:pointer;font-size:12.5px;} #dy-chat-close:hover{background:#3a4232;} .dy-chat-frame iframe{flex:1;border:0;width:100%;} /* ===================================================================== 11. 管理入口 + 管理员可视化面板(右下角:直传图片 / 文字样式) ===================================================================== */ .dy-admin-entry{margin-top:26px;padding:10px 16px;border:1px dashed #c9c4b4; border-radius:8px;font-size:12.5px;color:#8a8578;text-align:center;} .dy-admin-entry a{color:#8a8578;} /* —— 管理面板浮动条(仅管理员可见,Common.js 注入) —— */ #dy-admintool{position:fixed;right:18px;bottom:18px;z-index:210; display:flex;align-items:center;gap:8px; background:#232819;border:1px solid rgba(230,210,144,.35);border-radius:999px; padding:7px 14px;box-shadow:0 3px 12px rgba(20,25,15,.4);} #dy-admintool .dy-at-cap{color:var(--dy-gold);font-size:12.5px;font-weight:700;letter-spacing:1px;} #dy-admintool button,#dy-admintool a{background:#3a4232;color:var(--dy-gold); border:1px solid rgba(230,210,144,.35);border-radius:999px; padding:4px 12px;font-size:12.5px;cursor:pointer;text-decoration:none;font-family:inherit;} #dy-admintool button:hover,#dy-admintool a:hover{background:#4a5440;color:#f5e6b8;} /* —— 通用小弹窗(上传 / 文字样式共用) —— */ #dy-dlg{position:fixed;inset:0;z-index:520;background:rgba(10,12,8,.66); display:flex;align-items:center;justify-content:center;} .dy-dlg-card{width:min(480px,94vw);background:#ffffff;border-radius:12px;overflow:hidden; box-shadow:0 10px 40px rgba(0,0,0,.5);} .dy-dlg-bar{background:var(--dy-green);color:var(--dy-gold); padding:8px 14px;font-size:14px;font-weight:700;letter-spacing:1px; display:flex;justify-content:space-between;align-items:center;} #dy-dlg-close{background:none;border:1px solid rgba(230,210,144,.4);color:var(--dy-gold); border-radius:6px;padding:2px 10px;cursor:pointer;} .dy-dlg-body{padding:18px;} /* 弹窗内表单行 */ .dy-frow{display:flex;align-items:center;gap:10px;margin-bottom:12px;} .dy-frow > label{flex:0 0 56px;font-size:13px;color:#5a5548;} .dy-frow input[type="text"],.dy-frow input:not([type]),.dy-frow select{ flex:1;border:1px solid #cfcabb;border-radius:6px;padding:6px 9px;font-size:13.5px;} .dy-frow input[type="file"]{font-size:12.5px;} .dy-frow input[type="color"]{width:42px;height:30px;border:1px solid #cfcabb;border-radius:6px; padding:0;cursor:pointer;vertical-align:middle;} /* 颜色快选色块 */ .dy-sw{width:24px;height:24px;border:1px solid #b9b4a4;border-radius:5px;cursor:pointer; vertical-align:middle;margin-right:4px;} .dy-sw:hover{outline:2px solid var(--dy-gold-d);} /* 应用按钮 / 结果提示 */ .dy-fbtn{display:block;width:100%;background:var(--dy-green);color:var(--dy-gold); border:0;border-radius:8px;padding:9px 0;font-size:14px;font-weight:700; letter-spacing:2px;cursor:pointer;font-family:inherit;} .dy-fbtn:hover{background:var(--dy-green-2);} .dy-ftip{margin-top:12px;font-size:12.5px;color:#5a5548;line-height:1.9; background:#e3f2ef;border:1px solid #cfe3de;border-radius:8px;padding:9px 12px;} .dy-ftip code{background:#fff;border:1px solid #cfe3de;border-radius:4px;padding:0 5px;} /* ===================================================================== 12. 手机端适配 ===================================================================== */ @media(max-width:760px){ #dy-topnav{gap:14px;overflow-x:auto;justify-content:flex-start;padding:0 10px;} #dy-topnav a{padding:4px 10px;font-size:13px;white-space:nowrap;} #mw-page-base::before{letter-spacing:6px;font-size:14px;} /* 装饰水印缩小 */ .dy-hero{flex-direction:column;align-items:flex-start;padding:20px;} .dy-hero-logo{display:none;} .dy-hero-title{font-size:24px;letter-spacing:4px;} .dy-grid2{grid-template-columns:1fr;} .dy-lines2{grid-template-columns:1fr;} .dy-pcard{flex-direction:row;} #content{padding-top:3.6em !important;} /* 手机端同样无分隔线(已移除) */ /* 手机端:固定绿列改为跟随面板自身的绿色背景 */ body::before{display:none;} #mw-panel{width:auto;background:var(--dy-side-olive);} /* ★ 手机端功能按钮独立成行:旗帜占第一行,按钮整行在旗帜下方, 彻底避免按钮组贴/盖住「帝鹰维基」标题图(桌面端仍为靠右同行,不受影响) */ #mw-page-base{height:calc(var(--dy-tabstrip) * 2) !important;} #mw-head-base{height:calc(var(--dy-tabstrip) * 2) !important; margin-top:calc(-2 * var(--dy-tabstrip)) !important;} #mw-head{top:calc(var(--dy-nav-height) + var(--dy-tabstrip)) !important; overflow-x:auto;} /* 按钮多时可左右滑动 */ #p-logo{height:var(--dy-tabstrip) !important;} /* 旗帜只占第一行 */ /* 按钮组从侧栏右缘开始排,绝不再压回标题图/侧栏 */ #left-navigation,#right-navigation{float:none !important;} #left-navigation{margin-left:calc(var(--dy-sidebar-width) + 8px) !important;margin-right:10px;} } /* ===================================================================== 13. 侧边栏「联系入口」模块(📞 联系窗口 + 🤖 咨询窗口,Common.js 注入) ===================================================================== */ /* 侧边栏工具组(工具/链入页面/引用等)整体隐藏 */ #p-tb{display:none !important;} #dy-contact{margin:10px 10px 2px;background:#232819; border:1px solid rgba(230,210,144,.28);border-radius:10px; padding:10px 10px 11px;color:var(--dy-gold);} #dy-contact button{display:block;width:100%;margin-bottom:6px; background:#3a4232;color:var(--dy-gold); border:1px solid rgba(230,210,144,.35);border-radius:6px; padding:5px 0;font-size:13px;cursor:pointer;font-family:inherit;} #dy-contact button:hover{background:#4a5440;color:#f5e6b8;} /* 联系窗口信息条目 */ .dy-ct-item{font-size:13.5px;line-height:2.1;color:#3a3a35; border-bottom:1px dashed #ddd;padding:4px 2px;} .dy-ct-item:last-of-type{border-bottom:0;margin-bottom:10px;} /* AI 咨询窗口:对话气泡 */ #dy-ai-log{height:300px;overflow-y:auto;background:#f7fbfa; border:1px solid #cfe3de;border-radius:8px;padding:10px; display:flex;flex-direction:column;gap:8px;} .dy-ai-msg{max-width:85%;padding:7px 11px;border-radius:10px; font-size:13px;line-height:1.8;white-space:pre-wrap;word-break:break-word;} .dy-ai-msg.bot{background:#e3f2ef;color:#23281f;align-self:flex-start; border:1px solid #cfe3de;} .dy-ai-msg.user{background:#1f2733;color:#ffffff;align-self:flex-end;} .dy-ai-input{display:flex;gap:8px;margin-top:10px;} .dy-ai-input input{flex:1;border:1px solid #cfcabb;border-radius:6px; padding:7px 10px;font-size:13.5px;} .dy-ai-input button{background:var(--dy-green);color:var(--dy-gold); border:0;border-radius:6px;padding:7px 16px;font-size:13.5px; font-weight:700;cursor:pointer;font-family:inherit;letter-spacing:2px;} .dy-ai-input button:hover{background:var(--dy-green-2);} /* ============================================================ 【v23 追加】人物档案卡片样式(帝鹰著名总策划师 / 今日揭露档案) ============================================================ */ /* ===================================================================== 【帝鹰维基 · 人物档案卡片】配套样式(粘贴到 MediaWiki:Common.css 末尾即可) 适用板块:帝鹰著名总策划师 / 今日揭露档案(反对精日人物) 样式对标示例图:紫色圆角顶栏 + 白底圆角卡身 + 圆形头像 + 简介文 + 右下角【完整文章】跳转;桌面 2×2 网格,手机单列。 所有类名以 dy-dos 开头(dossier=档案),与站内既有样式(dy-pcard 等)零冲突。 ===================================================================== */ /* ---------- 参数区:想换颜色 / 间距只改这里 ---------- */ :root{ --dy-dos-purple:#5e2ec7; /* 紫色顶栏底色 */ --dy-dos-purple-deep:#4a1fa0; /* 顶栏渐变深端 */ --dy-dos-gap:22px; /* 卡片之间的间距 */ --dy-dos-radius:16px; /* 卡片圆角 */ --dy-dos-avatar:84px; /* 圆形头像直径 */ } /* ---------- 2×2 网格容器:每四个卡片一组自动排成两行两列 ---------- */ .dy-dos-grid{ display:grid; grid-template-columns:repeat(2,1fr); /* 两列;改 1fr 4fr 等可调列数 */ gap:var(--dy-dos-gap); margin:14px 0; } /* ---------- 卡片本体:白底圆角框 + 轻阴影,内容超长自动撑高 ---------- */ .dy-dos-card{ background:#ffffff; border:1px solid #ececf2; border-radius:var(--dy-dos-radius); box-shadow:0 4px 14px rgba(40,20,90,.08); overflow:hidden; /* 让顶栏圆角贴合卡身 */ display:flex; flex-direction:column; } /* ---------- 紫色圆角标题栏:白色加粗文字居中 ---------- */ .dy-dos-bar{ margin:8px 8px 0; /* 顶栏四周留白边,贴样图的悬浮感 */ background:linear-gradient(180deg,var(--dy-dos-purple),var(--dy-dos-purple-deep)); color:#ffffff; font-weight:bold; font-size:15.5px; letter-spacing:2px; text-align:center; padding:9px 10px; border-radius:12px; } /* ---------- 卡身:上(头像+信息)中(简介)下(完整文章) ---------- */ .dy-dos-body{ padding:12px 14px 12px; display:flex; flex-direction:column; flex:1 1 auto; /* 撑满卡身,让底链贴底对齐 */ } .dy-dos-top{ display:flex; gap:12px; align-items:flex-start; } /* 圆形头像:任何上传的方图都会被裁成正圆(有意设计,同站内头像规范) */ .dy-dos-avatar img{ width:var(--dy-dos-avatar); height:var(--dy-dos-avatar); border-radius:50%; object-fit:cover; border:3px solid #f0eef8; box-sizing:border-box; display:block; } .dy-dos-info{ flex:1 1 auto; min-width:0; /* 允许姓名过长时正常换行不撑破 */ } .dy-dos-name{ font-weight:700; font-size:16px; color:#23262e; line-height:1.5; } /* 身份标签:淡紫胶囊 */ .dy-dos-tag{ display:inline-block; margin:3px 0 2px; padding:2px 12px; font-size:12px; color:var(--dy-dos-purple); background:#f1e9ff; border-radius:999px; } .dy-dos-birth{ font-size:12.5px; color:#777; line-height:1.7; } /* 简介文字:自动换行,中英混排不撑破卡片 */ .dy-dos-desc{ margin-top:9px; font-size:13.5px; line-height:2.0; color:#3a3f4a; word-break:break-word; overflow-wrap:anywhere; } /* 底部【完整文章】:右对齐、紫色、hover 加深 */ .dy-dos-more{ margin-top:auto; /* 简介再短也贴卡片底部 */ padding-top:8px; text-align:right; } .dy-dos-more a{ color:var(--dy-dos-purple); font-size:13px; font-weight:600; text-decoration:none; } .dy-dos-more a:hover{ color:var(--dy-dos-purple-deep); text-decoration:underline; } /* ---------- 手机端(≤760px):自动变单列,卡片不挤 ---------- */ @media (max-width:760px){ .dy-dos-grid{grid-template-columns:1fr;gap:16px;} .dy-dos-avatar img{width:68px;height:68px;} /* 头像略缩小 */ } /* ============================================================ 【v23 追加】顶部功能按钮组护栏(远离旗帜标题图) ============================================================ */ /* ===================================================================== 【帝鹰维基 · 顶部功能按钮组位置】(粘贴到 MediaWiki:Common.css 末尾即可) 需求:阅读 / 讨论 / 查看源代码 / 查看历史 等整组按钮向右移动, 远离左侧「帝鹰维基」标题旗帜,任何窗口宽度都不覆盖旗帜。 说明:本段是「追加保险」,站内已有右对齐规则时此段只补护栏,互不冲突。 ===================================================================== */ /* 参数:按钮组与旗帜的最小净距(想要更远就调大数值) */ :root{ --dy-btn-clear:16px; } /* ① 整条按钮行左侧留出旗帜宽度 + 净距:flex 布局再挤也压不到旗帜上 */ #mw-head{ padding-left:calc(var(--dy-sidebar-width) + var(--dy-btn-clear)) !important; box-sizing:border-box; /* 内边距计入高度盒,面板高度不变 */ overflow-x:auto; /* 极窄窗口下按钮行可横向滑动,绝不左溢压图 */ scrollbar-width:none; /* 隐藏滚动条,外观保持干净 */ } #mw-head::-webkit-scrollbar{display:none;} /* ② 左组(页面/讨论)推到面板右端,与右组(阅读/查看源代码/查看历史/搜索)连成一排 */ #left-navigation{ margin-left:auto !important; /* 右对齐 = 整体远离标题旗帜 */ margin-right:14px; /* 与「阅读」组之间留一档间距 */ } /* —— 备选方案(默认不启用):把按钮组居中放在标题上方的空白区。 想切换时:注释掉上面 ② 的 margin-left:auto,再放开下面两行 —— #left-navigation{ position:absolute;left:50%;transform:translateX(-50%); margin-left:0 !important;top:0;bottom:0;display:flex;align-items:center; } ———————————————————————————————————————————————————— */ /* ============================================================ 【v24 追加】主页人物卡绿色主题变体(不用紫色,沿用站内卡片底色) 用法:<div class="dy-dos-grid dy-dos-green"> 包住卡片即可。 ============================================================ */ /* 参数:绿色主题取色(与站内其他卡片/面板同源) */ :root{ --dy-dos-green-bg:var(--dy-card-inner,#e3f2ef); /* 卡片底色 = 站内卡片同款浅青 */ --dy-dos-green-bar:#2c3226; /* 卡顶小标题条 = 军装橄榄绿 */ --dy-dos-green-ink:#d9b45c; /* 小标题条文字 = 金色 */ --dy-dos-green-tag:#4f5c44; /* 标签文字 = 深橄榄 */ } /* 卡片框:底色与站内其他卡片一致,边框柔化 */ .dy-dos-green .dy-dos-card{ background:var(--dy-dos-green-bg); border-color:#cfe2dc; box-shadow:0 3px 10px rgba(38,43,33,.08); } /* 卡顶小标题条(可选结构):绿色条+金字,替代紫色 */ .dy-dos-green .dy-dos-bar{ background:var(--dy-dos-green-bar); color:var(--dy-dos-green-ink); letter-spacing:3px; } /* 标签:金绿配色 */ .dy-dos-green .dy-dos-tag{ color:var(--dy-dos-green-tag); background:#e6ecdd; } /* 底部链接:金色,与站点金色主题呼应 */ .dy-dos-green .dy-dos-more a{color:var(--dy-gold,#9a7425);} .dy-dos-green .dy-dos-more a:hover{color:#7c5c1c;} /* 无头像时的占位圆字(如:龙阳暂未传头像 → <div class="dy-dos-avatar dy-dos-ph">龙</div>) */ .dy-dos-avatar.dy-dos-ph{ width:var(--dy-dos-avatar,84px); height:var(--dy-dos-avatar,84px); border-radius:50%; background:var(--dy-dos-green-bar); color:var(--dy-dos-green-ink); font-size:30px; font-weight:700; display:flex; align-items:center; justify-content:center; border:3px solid #f0eef8; box-sizing:border-box; flex:0 0 auto; } @media (max-width:760px){ .dy-dos-avatar.dy-dos-ph{width:68px;height:68px;font-size:24px;} } /* ============================================================ 【v26 追加】隐藏页脚 "Powered by MediaWiki" 图标水印 ============================================================ */ #footer-poweredbyico{display:none !important;} /* ============================================================ 【v26 追加】隐藏顶部「Mini Pig」导航/面包屑文字链接(仅视觉隐藏, 词条与跳转逻辑不受影响;元素若当前不存在则此规则自动休眠) ============================================================ */ .mw-breadcrumb a[title="Mini Pig"], #p-navigation a[title="Mini Pig"], #p-帝鹰网联 a[title="Mini Pig"], #left-navigation a[title="Mini Pig"], #right-navigation a[title="Mini Pig"], a[title="Mini Pig"]{display:none !important;} /* ============================================================ 【v27 追加】管理层 · 成员名录板块(Main Page) —— 暗藏青底(同顶部导航 #1f2733)+ 复古纸张/鹰翼暗纹 + 浅金标题 + 浅白名单。可调参数均标注在下方。 ============================================================ */ /* 板块底色:与顶部导航同源的暗藏青;边框金线透明度可调 */ .dy-roster{ position:relative; overflow:hidden; background:var(--dy-roster-bg,#1f2733); border:1px solid rgba(217,180,92,.22); border-radius:14px; padding:26px 26px 22px; } /* 复古纸张暗纹:极淡横向细线,模拟旧纸质感(透明度 .022 可调) */ .dy-roster::before{ content:"";position:absolute;inset:0;pointer-events:none; background:repeating-linear-gradient(0deg,rgba(255,255,255,.022) 0 2px,transparent 2px 5px); } /* 鹰翼几何暗纹:右上角金色放射细线,加径向渐隐(透明度 .05 可调) */ .dy-roster::after{ content:"";position:absolute;right:-40px;top:-40px; width:280px;height:280px;pointer-events:none; background:repeating-linear-gradient(115deg,rgba(217,180,92,.05) 0 1px,transparent 1px 14px); transform:rotate(8deg); -webkit-mask-image:radial-gradient(circle at 70% 30%,#000 0%,transparent 70%); mask-image:radial-gradient(circle at 70% 30%,#000 0%,transparent 70%); } /* 板块标题:浅金色、居中、加宽字距 */ .dy-roster-h{ position:relative;z-index:1; color:#d9b45c; font-size:1.35em;font-weight:700;letter-spacing:.12em; text-align:center;margin:0 0 18px; text-shadow:0 1px 0 rgba(0,0,0,.35); } /* 名单分组行:组标签 + 成员名,行间虚线分隔 */ .dy-roster-g{ position:relative;z-index:1; display:flex;align-items:baseline;gap:12px; padding:10px 0; border-bottom:1px dashed rgba(217,180,92,.18); } .dy-roster-g:last-child{border-bottom:none;} /* 组标签:金色胶囊、深色文字 */ .dy-roster-tag{ flex:0 0 auto; color:#1f2733;background:#d9b45c; font-size:.78em;font-weight:700;letter-spacing:.15em; padding:3px 12px;border-radius:999px; } /* 成员名单:浅白色文字 */ .dy-roster-names{ color:#f5f5f2; font-size:1.05em;letter-spacing:.05em;line-height:1.9; } /* 手机端适配:分组改为上下排列 */ @media (max-width:760px){ .dy-roster{padding:20px 16px;} .dy-roster-h{font-size:1.15em;} .dy-roster-g{flex-direction:column;gap:6px;align-items:flex-start;} } /* ============================================================ 【v28 追加】主页「新建人物」卡片 + 侧栏「词条专栏」 ============================================================ */ /* 新建人物卡:虚线金边,整卡可点(点击行为由 Common.js 绑定),悬停加亮 */ .dy-dos-card.dy-dos-new{ border:2px dashed rgba(154,116,37,.5); background:rgba(154,116,37,.05); cursor:pointer; transition:border-color .2s, background .2s; } .dy-dos-card.dy-dos-new:hover{ border-color:#9a7425; background:rgba(154,116,37,.12); } /* 侧栏「词条专栏」每条后面的编辑笔 ✎ */ .dy-portal-edit{font-size:12px;opacity:.65;margin-left:6px;text-decoration:none;} .dy-portal-edit:hover{opacity:1;} /* 【v33 追加】主页人物卡片 ✎ 编辑按钮(仅管理员显示,JS 注入) */ .dy-dos-card{position:relative;} .dy-card-edit{ position:absolute;right:12px;bottom:10px; font-size:12px;color:#9a7425;opacity:.55;text-decoration:none; } .dy-card-edit:hover{opacity:1;text-decoration:underline;}
common.js (留言) (翻译) /* 这里的任何JavaScript将为所有用户在每次页面加载时加载。 */
/* ===================================================================== 帝鹰维基 · 全站脚本 v13 模块:① 顶部主导航 ② 管理员可视化面板(直传图片+文字样式) ③ ♪ 帝鹰电台 ④ 💬 聊天室 ⑤ 📞 联系入口(联系窗口 + 🤖 AI 咨询窗口) ===================================================================== */ (function () { /* ---------- ① 顶部主导航:改入口就在 links 列表里,一行一个 ---------- */ var links = [ ['主站', '首页'], ['成员专区', '帝鹰核心成员'], ['组织章程', '组织章程'], ['史料归档', '聊天室记录归档'], ['分类', 'Special:Categories'] ]; function buildNav() { if (document.getElementById('dy-topnav')) return; var nav = document.createElement('nav'); nav.id = 'dy-topnav'; links.forEach(function (it) { var a = document.createElement('a'); a.href = mw.util.getUrl(it[1]); a.textContent = it[0]; nav.appendChild(a); }); var pageBase = document.getElementById('mw-page-base'); if (pageBase && pageBase.parentNode) { pageBase.parentNode.insertBefore(nav, pageBase); } else { document.body.insertBefore(nav, document.body.firstChild); } } /* ---------- ② 管理员专属:可视化编辑面板(右下角浮动条) ---------- 功能:🖼️ 本页直接上传图片(不跳转原生上传页,传完显示文件名可直接填卡片) 🎨 文字样式(字色/字号/字体可视化选择 → 源代码编辑器内直接包裹所选文字, 可视化编辑器内则生成 {{彩色文字}}/{{字体样式}} 模板代码一键复制) 仅 sysop(管理员)可见,访客不加载。 */ function isAdmin() { return (mw.config.get('wgUserGroups') || []).indexOf('sysop') !== -1; } /* 通用小弹窗:标题 + 内容HTML + 关闭 */ function dyDialog(title, bodyHtml) { var ov = document.getElementById('dy-dlg'); if (ov) ov.remove(); ov = document.createElement('div'); ov.id = 'dy-dlg'; ov.innerHTML = '<div class="dy-dlg-card">' + '<div class="dy-dlg-bar"><span>' + title + '</span>' + '<button id="dy-dlg-close">✕</button></div>' + '<div class="dy-dlg-body">' + bodyHtml + '</div>' + '</div>'; document.body.appendChild(ov); ov.addEventListener('click', function (e) { if (e.target === ov) ov.remove(); }); ov.querySelector('#dy-dlg-close').addEventListener('click', function () { ov.remove(); }); return ov; } /* 把代码写进源代码编辑器当前光标/选区(源代码编辑模式专用) */ function insertToSourceEditor(code) { var ta = document.getElementById('wpTextbox1'); if (!ta) return false; var s = ta.selectionStart, e = ta.selectionEnd; ta.value = ta.value.slice(0, s) + code + ta.value.slice(e); ta.selectionStart = ta.selectionEnd = s + code.length; ta.focus(); return true; } /* 🎨 文字样式弹窗:颜色+字号+字体 → 编辑器包裹 / 模板代码 */ function openTextDialog() { var sel = ''; var ta = document.getElementById('wpTextbox1'); if (ta && ta.selectionStart !== ta.selectionEnd) { sel = ta.value.slice(ta.selectionStart, ta.selectionEnd); } var colors = ['#b3261e', '#c0392b', '#e67e22', '#8a7434', '#2f7a3f', '#1f6f8b', '#3f51b5', '#7b1fa2', '#23281f', '#ffffff']; var sw = colors.map(function (c) { return '<button type="button" class="dy-sw" data-c="' + c + '" style="background:' + c + '"></button>'; }).join(''); var sizes = ['12px', '14px', '15px', '17px', '20px', '24px', '30px', '36px'].map(function (s) { return '<option value="' + s + '">' + s + '</option>'; }).join(''); var fonts = '<option value="">(不换字体)</option><option value="KaiTi">楷体</option>' + '<option value="SimSun">宋体</option><option value="SimHei">黑体</option>' + '<option value="FangSong">仿宋</option><option value="STZhongsong">中宋</option>'; var ov = dyDialog('🎨 文字样式(字色 / 字号 / 字体)', '<div class="dy-frow"><label>文字</label><input id="dy-f-text" value="' + sel.replace(/"/g, '"') + '" placeholder="要美化的文字"></div>' + '<div class="dy-frow"><label>颜色</label><div>' + sw + '<input type="color" id="dy-f-color" value="#b3261e" title="自定义颜色"></div></div>' + '<div class="dy-frow"><label>字号</label><select id="dy-f-size"><option value="">(默认大小)</option>' + sizes + '</select></div>' + '<div class="dy-frow"><label>字体</label><select id="dy-f-font">' + fonts + '</select></div>' + '<button id="dy-f-ok" class="dy-fbtn">应用到编辑器</button>' + '<div id="dy-f-tip" class="dy-ftip"></div>'); // 色块点选 → 同步到取色器 ov.querySelectorAll('.dy-sw').forEach(function (b) { b.addEventListener('click', function () { ov.querySelector('#dy-f-color').value = b.getAttribute('data-c'); }); }); ov.querySelector('#dy-f-ok').addEventListener('click', function () { var text = ov.querySelector('#dy-f-text').value || '文字'; var color = ov.querySelector('#dy-f-color').value; var size = ov.querySelector('#dy-f-size').value; var font = ov.querySelector('#dy-f-font').value; var style = ''; if (color) style += 'color:' + color + ';'; if (size) style += 'font-size:' + size + ';'; if (font) style += 'font-family:' + font + ';'; if (!style) { alert('请至少选择一种样式'); return; } // 源代码编辑器:直接包裹所选文字,所见即所得 if (document.getElementById('wpTextbox1')) { insertToSourceEditor('<span style="' + style + '">' + text + '</span>'); ov.remove(); return; } // ★ 可视化编辑器(VE):直接往编辑区插入带样式的文字(所见即所得), // 不再让用户去插模板——这是之前「字色切换没成功显示」的根因。 // 两步法(实测最稳):① insertContent 插纯文本(选区自动覆盖新文字) // ② annotateContent('set', 注解) 给选区套样式。 // 注解必须由 ve.dm.annotationFactory.create 生成,不能用裸对象。 var veSurface = window.ve && ve.init && ve.init.target && ve.init.target.surface; if (veSurface) { try { veSurface.getView().focus(); // 聚焦编辑区,插入到当前光标 var veModel = veSurface.getModel(); var veFrag = veModel.getFragment(); veFrag.insertContent(text); // ① 插入纯文本,选区自动落在文字上 var veAnn = ve.dm.annotationFactory.create('textStyle/span', { attributes: { style: style } }); veFrag.annotateContent('set', veAnn); // ② 给选区加样式注解 ov.remove(); return; } catch (err) { /* VE 插入失败则走下面的模板代码兜底 */ } } // 普通页面(非编辑状态):生成模板代码 + 使用说明 var wikitext = font ? '{{字体样式|字体=' + font + '|字号=' + (size || '') + '|文字=' + text + '}}' : '{{彩色文字|颜色=' + color + '|字号=' + (size || '') + '|文字=' + text + '}}'; var tip = ov.querySelector('#dy-f-tip'); tip.innerHTML = '请先进入编辑状态再点「🎨 文字样式」即可直接插入。<br>' + '生成代码(已复制):<code>' + wikitext.replace(/</g, '<') + '</code>'; try { navigator.clipboard.writeText(wikitext); } catch (e) {} }); } /* 🖼️ 本页直接上传弹窗:选文件 → mw.Api 上传 → 显示文件名用法 */ function openUploadDialog() { var ov = dyDialog('🖼️ 上传图片 / 头像(本页直传)', '<div class="dy-frow"><label>选择文件</label><input type="file" id="dy-u-file" accept="image/*"></div>' + '<div class="dy-frow"><label>文件名</label><input id="dy-u-name" placeholder="留空=自动用原文件名(建议英文/拼音)"></div>' + '<button id="dy-u-ok" class="dy-fbtn">开始上传</button>' + '<div id="dy-u-tip" class="dy-ftip">上传完成后会显示文件名;把文件名填进卡片模板的 头像= 参数即可换头像。</div>'); ov.querySelector('#dy-u-ok').addEventListener('click', function () { var f = ov.querySelector('#dy-u-file').files[0]; var tip = ov.querySelector('#dy-u-tip'); if (!f) { alert('请先选择图片文件'); return; } var name = ov.querySelector('#dy-u-name').value.trim() || f.name; if (!/\.(png|jpe?g|gif|webp|svg)$/i.test(name)) { name += '.' + (f.name.split('.').pop() || 'jpg'); // 补扩展名 } name = name.replace(/[^\w.-\u4e00-\u9fa5]/g, '_'); // 清理非法字符 tip.textContent = '上传中…(' + name + ')'; new mw.Api().upload(f, { filename: name, comment: '管理员页面直传(帝鹰维基)', ignorewarnings: true }).done(function (data) { var fn = data && data.upload && data.upload.filename ? data.upload.filename : name; tip.innerHTML = '✅ 上传成功!文件名:<b>' + fn + '</b><br>' + '用法:编辑主页卡片,把 头像= 参数改成 <code>' + fn + '</code> 即可;' + '文章里插入用 <code>[[' + fn + ']]</code>'; }).fail(function (err) { tip.innerHTML = '❌ 上传失败:' + (err && err.error ? err.error.info : JSON.stringify(err)); }); }); } /* 面板本体:右下角浮动条(替代旧「上传图片」跳转按钮) */ function addAdminPanel() { if (!isAdmin()) return; // 仅管理员可见 if (document.getElementById('dy-admintool')) return; var bar = document.createElement('div'); bar.id = 'dy-admintool'; bar.innerHTML = '<span class="dy-at-cap">⚙️ 管理面板</span>' + '<button id="dy-at-upload">🖼️ 上传图片</button>' + '<button id="dy-at-text">🎨 文字样式</button>' + '<a id="dy-at-wiki" href="' + mw.util.getUrl('Special:Upload') + '" target="_blank" title="原生上传页(备用)">原生上传</a>'; document.body.appendChild(bar); bar.querySelector('#dy-at-upload').addEventListener('click', openUploadDialog); bar.querySelector('#dy-at-text').addEventListener('click', openTextDialog); } /* ---------- ③ ♪ 帝鹰电台(侧边栏模块) ---------- 曲库来自 /music-list.js(服务器定时生成,window.DY_MUSIC 数组: [{id,title,src},...]),音频文件在本站 /music/ 目录,跨页不断播由 浏览器自行决定;每个页面独立实例,点击播放即出声。 */ function addRadio(panel, logo) { if (document.getElementById('dy-radio')) return; var box = document.createElement('div'); box.id = 'dy-radio'; box.innerHTML = '<div class="dy-mod-h">♪ 帝鹰电台</div>' + '<div id="dy-r-title">曲库加载中…</div>' + '<div id="dy-r-ctl">' + '<button data-act="prev" title="上一首">⏮</button>' + '<button data-act="play" title="播放/暂停">▶</button>' + '<button data-act="next" title="下一首">⏭</button>' + '</div>'; if (logo && logo.nextSibling) panel.insertBefore(box, logo.nextSibling); else panel.appendChild(box); var list = [], idx = 0, audio = null, playing = false; var titleEl = box.querySelector('#dy-r-title'); var playBtn = box.querySelector('[data-act="play"]'); function ensureAudio() { if (audio) return; audio = new Audio(); audio.addEventListener('ended', function () { next(1); }); audio.addEventListener('playing', function () { playing = true; playBtn.textContent = '⏸'; }); audio.addEventListener('pause', function () { playing = false; playBtn.textContent = '▶'; }); } function show() { titleEl.textContent = list.length ? ('▶ ' + (idx + 1) + '. ' + list[idx].title) : '曲库为空'; } function play() { if (!list.length) return; ensureAudio(); var want = list[idx].src; if (audio.src !== location.origin + want && audio.getAttribute('src') !== want) { audio.src = want; // 首次/切歌:设置源 } if (playing) { audio.pause(); } else { audio.play(); } } function next(step) { if (!list.length) return; idx = (idx + step + list.length) % list.length; if (audio) { audio.src = list[idx].src; audio.play(); } show(); } box.addEventListener('click', function (e) { var act = e.target.getAttribute && e.target.getAttribute('data-act'); if (act === 'play') play(); else if (act === 'next') next(1); else if (act === 'prev') next(-1); }); // 曲库脚本:/music-list.js 内容为 window.DY_MUSIC=[...] var s = document.createElement('script'); s.src = '/music-list.js'; s.onload = function () { list = (window.DY_MUSIC || []).filter(function (m) { return m && m.src; }); show(); }; s.onerror = function () { titleEl.textContent = '电台曲库暂不可用'; }; document.head.appendChild(s); } /* ---------- ④ 💬 帝鹰聊天室(侧边栏入口 + 全屏弹层) ---------- 后端 = 同站 /chat/(api.php + index.html 自托管聊天室)。 主内容区不放聊天室,只有侧边栏这一个入口。 */ function addChat(panel, radio) { if (document.getElementById('dy-chat')) return; var box = document.createElement('div'); box.id = 'dy-chat'; box.innerHTML = '<div class="dy-mod-h">💬 帝鹰聊天室</div>' + '<button id="dy-chat-open">进入聊天室</button>'; if (radio && radio.nextSibling) panel.insertBefore(box, radio.nextSibling); else panel.appendChild(box); box.querySelector('#dy-chat-open').addEventListener('click', function () { var ov = document.getElementById('dy-chat-ov'); if (!ov) { ov = document.createElement('div'); ov.id = 'dy-chat-ov'; ov.innerHTML = '<div class="dy-chat-frame">' + '<div class="dy-chat-bar"><span>帝鹰聊天室</span>' + '<button id="dy-chat-close">✕ 关闭</button></div>' + '<iframe src="/chat/index.html" title="帝鹰聊天室"></iframe>' + '</div>'; document.body.appendChild(ov); ov.querySelector('#dy-chat-close').addEventListener('click', function () { ov.hidden = true; }); ov.addEventListener('click', function (e) { if (e.target === ov) ov.hidden = true; }); // 点空白处也可关 } ov.hidden = false; }); } /* ---------- ⑤ 📞 联系入口(侧边栏模块):联系窗口 + 🤖 AI 咨询窗口 ---------- */ function addContact(panel, chatBox) { if (document.getElementById('dy-contact')) return; var box = document.createElement('div'); box.id = 'dy-contact'; box.innerHTML = '<div class="dy-mod-h">📞 联系入口</div>' + '<button id="dy-contact-open">📞 联系窗口</button>' + '<button id="dy-ai-open">🤖 咨询窗口</button>'; if (chatBox && chatBox.nextSibling) panel.insertBefore(box, chatBox.nextSibling); else panel.appendChild(box); /* 联系窗口:管理事务通过管理员账号登录后台处理;即时交流走聊天室 */ box.querySelector('#dy-contact-open').addEventListener('click', function () { var ov = dyDialog('📞 联系窗口', '<div class="dy-ct-item"><b>站务/词条管理:</b>管理员账号密码登录本站即可直接处理</div>' + '<div class="dy-ct-item"><b>即时交流:</b>帝鹰聊天室(全员实时在线)</div>' + '<div class="dy-ct-item"><b>咨询求助:</b>侧边栏「🤖 咨询窗口」AI 助手随时解答</div>' + '<button id="dy-ct-chat" class="dy-fbtn">💬 前往帝鹰聊天室</button>'); ov.querySelector('#dy-ct-chat').addEventListener('click', function () { ov.remove(); var btn = document.getElementById('dy-chat-open'); if (btn) btn.click(); }); }); /* 咨询窗口:AI 对话(后端 /ai.php,密钥在服务端) */ box.querySelector('#dy-ai-open').addEventListener('click', function () { var ov = dyDialog('🤖 咨询窗口 · 帝鹰维基 AI 助手', '<div id="dy-ai-log">' + '<div class="dy-ai-msg bot">你好!我是帝鹰维基咨询助手 🦅<br>可以问我:词条在哪找 / 怎么入会 / 本站怎么用…</div>' + '</div>' + '<div class="dy-ai-input"><input id="dy-ai-text" placeholder="输入你的问题…">' + '<button id="dy-ai-send">发送</button></div>'); var log = ov.querySelector('#dy-ai-log'); var input = ov.querySelector('#dy-ai-text'); var history = []; function bubble(cls, text) { var d = document.createElement('div'); d.className = 'dy-ai-msg ' + cls; d.textContent = text; log.appendChild(d); log.scrollTop = log.scrollHeight; return d; } function send() { var text = input.value.trim(); if (!text) return; input.value = ''; bubble('user', text); var loading = bubble('bot', '思考中…'); fetch('/ai.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ message: text, history: history }) }) .then(function (r) { return r.json(); }) .then(function (j) { loading.remove(); var reply = j && j.ok ? (j.reply || '(AI 未返回内容)') : ('出错了:' + (j && j.error || '未知错误')); bubble('bot', reply); history.push({ role: 'user', content: text }, { role: 'assistant', content: reply }); if (history.length > 16) history = history.slice(-16); // 只保留最近 8 轮 }) .catch(function (e) { loading.remove(); bubble('bot', '网络异常:' + e.message); }); } ov.querySelector('#dy-ai-send').addEventListener('click', send); input.addEventListener('keydown', function (e) { if (e.key === 'Enter') send(); }); setTimeout(function () { input.focus(); }, 100); }); } /* ---------- 装配入口 ---------- */ function buildSide(panel) { var logo = document.getElementById('p-logo'); addRadio(panel, logo); addChat(panel, document.getElementById('dy-radio')); addContact(panel, document.getElementById('dy-chat')); } function boot() { buildNav(); addAdminPanel(); var panel = document.getElementById('mw-panel'); if (panel) buildSide(panel); } if (window.jQuery && mw && mw.util) { $(boot); } else { document.addEventListener('DOMContentLoaded', boot); } })(); /* ============================================================ 【v31 追加】人物数据驱动版: - 数据页 MediaWiki:DyPersons(JSON,MediaWiki 命名空间默认仅管理员可编辑) - 主页 #dyDosGrid 按 show=true 动态渲染人物卡片(所有人可见) - 分类:人物词条 页管理员面板:「主页展示 开/关」「改头像」按钮 - 新建人物:名字 + 头像(可空)+ 是否上主页,创建词条并写入数据页 ============================================================ */ mw.loader.using(["mediawiki.util", "mediawiki.api", "user"]).then(function () { var ADMIN = (mw.config.get("wgUserGroups") || []).indexOf("sysop") !== -1 || (mw.config.get("wgUserGroups") || []).indexOf("bureaucrat") !== -1; var DATA_TITLE = "MediaWiki:DyPersons"; function esc(s) { return String(s == null ? "" : s).replace(/[&<>"']/g, function (c) { return { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[c]; }); } function loadPersons() { return new mw.Api().get({ action: "query", prop: "revisions", titles: DATA_TITLE, rvprop: "content", rvslots: "main", format: "json", formatversion: 2 }).then(function (d) { var p = (d.query && d.query.pages && d.query.pages[0]) || {}; var txt = p.revisions && p.revisions[0] && p.revisions[0].slots && p.revisions[0].slots.main ? p.revisions[0].slots.main.content : ""; try { var j = JSON.parse(txt); return (j && j.persons) ? j : { persons: [] }; } catch (e) { return { persons: [] }; } }); } function savePersons(obj) { return new mw.Api().postWithToken("csrf", { action: "edit", title: DATA_TITLE, text: JSON.stringify(obj, null, 2), summary: "人物数据更新(管理面板)" }); } function avatarHtml(p) { if (p.avatar) { return '<div class="dy-dos-avatar"><img src="' + esc(mw.util.getUrl("Special:FilePath/" + p.avatar)) + '" alt="' + esc(p.title) + '"></div>'; } return '<div class="dy-dos-avatar dy-dos-ph">' + esc((p.title || "?").charAt(0)) + "</div>"; } function cardHtml(p) { return '<div class="dy-dos-card" data-title="' + esc(p.title) + '"><div class="dy-dos-body"><div class="dy-dos-top">' + avatarHtml(p) + '<div class="dy-dos-info"><div class="dy-dos-name">' + esc(p.title) + "</div>" + (p.tag ? '<div class="dy-dos-tag">' + esc(p.tag) + "</div>" : "") + (p.date ? '<div class="dy-dos-birth">' + esc(p.date) + "</div>" : "") + '</div></div><div class="dy-dos-desc">' + esc(p.desc || "") + '</div><div class="dy-dos-more"><a href="' + esc(mw.util.getUrl(p.title)) + '">完整文章 →</a></div></div></div>'; } /* ---------- 主页:渲染卡片并把「新建人物」卡移入网格 ---------- */ // 从词条页抓渲染后的 HTML:第一段文字 = 简介、第一张图 = 头像(词条内容自动同步主页) function fetchCardAuto(title) { return new mw.Api().get({ action: "parse", page: title, prop: "text", redirects: 1, formatversion: 2 }) .then(function (d) { var html = (d.parse && d.parse.text) || ""; var doc = new DOMParser().parseFromString(html, "text/html"); var out = doc.querySelector(".mw-parser-output") || doc.body; var img = null; Array.prototype.forEach.call(out.querySelectorAll("img"), function (im) { if (!img && (parseInt(im.getAttribute("width") || "0", 10) > 50) && (im.getAttribute("src") || "").indexOf("/images/") !== -1) img = im; }); var desc = ""; Array.prototype.forEach.call(out.querySelectorAll("p"), function (pe) { var t = (pe.textContent || "").replace(/\s+/g, " ").trim(); if (!desc && t.length >= 10) desc = t; }); return { img: img ? img.getAttribute("src") : "", desc: desc }; }, function () { return { img: "", desc: "" }; }); } function renderMain() { var grid = document.getElementById("dyDosGrid"); if (!grid) return; loadPersons().then(function (data) { var list = (data.persons || []).filter(function (p) { return p.show; }); grid.innerHTML = list.map(cardHtml).join(""); var newCard = document.getElementById("dyNewPerson"); if (newCard && newCard.parentNode !== grid) grid.appendChild(newCard); // 空缺字段自动从词条同步:头像圆框放词条第一张图、简介放词条第一段 list.forEach(function (p) { if (p.avatar && p.desc) return; fetchCardAuto(p.title).then(function (auto) { var el = grid.querySelector('.dy-dos-card[data-title="' + window.CSS.escape(p.title) + '"]'); if (!el) return; if (!p.avatar && auto.img) { var av = el.querySelector(".dy-dos-avatar"); if (av) { var n = document.createElement("div"); n.className = "dy-dos-avatar"; n.innerHTML = '<img alt="' + esc(p.title) + '">'; n.firstChild.src = auto.img; av.parentNode.replaceChild(n, av); } } if (!p.desc && auto.desc) { var de = el.querySelector(".dy-dos-desc"); if (de) de.textContent = auto.desc; } }); }); // 管理员:主页卡片直接 ✎ 可视化编辑(头像/简介),写回数据页 if (ADMIN) { Array.prototype.forEach.call(grid.querySelectorAll(".dy-dos-card[data-title]"), function (el) { var t = el.getAttribute("data-title"); var btn = document.createElement("a"); btn.textContent = "✎ 编辑"; btn.href = "#"; btn.className = "dy-card-edit"; btn.addEventListener("click", function (e) { e.preventDefault(); var pr = (data.persons || []).filter(function (x) { return x.title === t; })[0]; if (!pr) return; var av = window.prompt("改头像:输入头像文件名(如 Avatar-xxx.jpg)\n留空保持不变:", pr.avatar || ""); if (av === null) return; av = av.replace(/^\s+|\s+$/g, "").replace(/^文件:|^File:/i, ""); var de = window.prompt("改简介:输入一句话简介\n留空保持不变(留空则继续用词条里的第一段):", pr.desc || ""); if (de === null) return; pr.avatar = av; pr.desc = de.trim(); savePersons(data).then(function () { renderMain(); }).fail(function (x) { alert("保存失败:" + (x || "")); }); }); el.appendChild(btn); }); } }); } /* ---------- 分类页管理员面板 ---------- */ function rowFor(data, p) { var row = document.createElement("div"); row.style.cssText = "display:flex;align-items:center;gap:10px;padding:8px 0;border-bottom:1px dashed rgba(154,116,37,.25);"; var name = document.createElement("b"); name.textContent = p.title; name.style.minWidth = "140px"; row.appendChild(name); var btn1 = document.createElement("button"); btn1.textContent = "主页展示:" + (p.show ? "开" : "关"); btn1.style.cssText = "padding:4px 12px;border-radius:6px;border:1px solid #9a7425;background:" + (p.show ? "rgba(154,116,37,.18);color:#e8c87a;" : "transparent;color:#999;") + "cursor:pointer;"; btn1.addEventListener("click", function () { p.show = !p.show; savePersons(data).then(function () { drawPanel(); }).fail(function (e) { p.show = !p.show; alert("保存失败:" + (e || "")); }); }); row.appendChild(btn1); var btn2 = document.createElement("button"); btn2.textContent = p.avatar ? "改头像" : "设头像"; btn2.style.cssText = "padding:4px 12px;border-radius:6px;border:1px solid #777;background:transparent;color:#ddd;cursor:pointer;"; btn2.addEventListener("click", function () { var f = window.prompt("输入头像文件名(如 Avatar-xxx.jpg)。\n若还没上传,先到 Special:Upload 上传。\n留空 = 用占位圆字:", p.avatar || ""); if (f === null) return; f = f.replace(/^\s+|\s+$/g, "").replace(/^文件:|^File:/i, ""); p.avatar = f; savePersons(data).then(function () { drawPanel(); }).fail(function (e) { alert("保存失败:" + (e || "")); }); }); row.appendChild(btn2); var btn3 = document.createElement("button"); btn3.textContent = "改简介"; btn3.style.cssText = "padding:4px 12px;border-radius:6px;border:1px solid #777;background:transparent;color:#ddd;cursor:pointer;"; btn3.addEventListener("click", function () { var d2 = window.prompt("输入一句话简介(显示在主页卡片里,可留空):", p.desc || ""); if (d2 === null) return; p.desc = d2.trim(); savePersons(data).then(function () { drawPanel(); }).fail(function (e) { alert("保存失败:" + (e || "")); }); }); row.appendChild(btn3); return row; } var panelBox = null; // 与「分类:人物词条」自动同步:分类里有而数据页没有的词条自动补入(默认不上主页); // 数据页里残留但分类里已不存在的(词条被删)自动清掉。 function syncWithCategory(data) { return new mw.Api().get({ action: "query", list: "categorymembers", cmtitle: "分类:人物词条", cmlimit: 200, cmnamespace: 0, format: "json", formatversion: 2 }).then(function (d) { var inCat = ((d.query && d.query.categorymembers) || []).map(function (m) { return m.title; }); var changed = false; var known = {}; data.persons = data.persons || []; data.persons.forEach(function (p) { known[p.title] = true; }); inCat.forEach(function (t) { if (!known[t]) { data.persons.push({ title: t, tag: "成员", date: "", avatar: "", show: false, desc: "" }); changed = true; } }); var catSet = {}; inCat.forEach(function (t) { catSet[t] = true; }); var before = data.persons.length; data.persons = data.persons.filter(function (p) { return catSet[p.title]; }); if (data.persons.length !== before) changed = true; if (changed) { return savePersons(data).then(function () { return data; }).fail(function () { return data; }); } return data; }); } function drawPanel() { loadPersons().then(function (data) { return syncWithCategory(data); }).then(function (data) { if (!panelBox) return; panelBox.innerHTML = ""; var tip = document.createElement("div"); tip.textContent = "人物主页展示管理(仅管理员可见):开关决定是否显示在主页人物栏"; tip.style.cssText = "font-size:12px;color:#bfa15a;margin-bottom:6px;"; panelBox.appendChild(tip); (data.persons || []).forEach(function (p) { panelBox.appendChild(rowFor(data, p)); }); }); } /* ---------- 新建人物:名字 + 头像 + 是否上主页 ---------- */ function dyNewPerson() { var name = window.prompt("第一步:输入新人物的名字(2–20 字):", ""); if (name === null) return; name = name.replace(/^\s+|\s+$/g, ""); if (name.length < 2 || name.length > 20) { alert("名字需要 2–20 个字"); return; } if (/[|#<>[\]{}]/.test(name)) { alert("名字不能包含 # | < > [ ] { } 等符号"); return; } var av = window.prompt("第二步:头像文件名(如 Avatar-xxx.jpg)。\n还没上传?先打开 Special:Upload 页上传,再回来填。\n留空 = 用占位圆字:", ""); if (av === null) return; av = av.replace(/^\s+|\s+$/g, "").replace(/^文件:|^File:/i, ""); var show = window.confirm("第三步:是否立即展示到主页人物栏?\n(确定 = 立即上主页;取消 = 只建词条,稍后在左侧「人物词条」列表页打开展示)"); loadPersons().then(function (data) { data.persons = data.persons || []; var exists = data.persons.filter(function (p) { return p.title === name; })[0]; if (exists) { alert("这个人已经在名录里了"); return; } data.persons.push({ title: name, tag: "成员", date: "", avatar: av, show: !!show, desc: "" }); savePersons(data).then(function () { window.location.href = mw.util.getUrl(name, { action: "edit", redlink: "1", preload: "Template:人物/新建" }); }).fail(function (e) { alert("数据保存失败:" + (e || "")); }); }); } /* ---------- 入口分发 ---------- */ if (mw.config.get("wgPageName") === "Main_Page") { renderMain(); if (ADMIN) { var card = document.getElementById("dyNewPerson"); if (card) card.addEventListener("click", function (e) { if (e.target && e.target.closest && e.target.closest("a")) return; e.preventDefault(); dyNewPerson(); }); } else { var c0 = document.getElementById("dyNewPerson"); if (c0) c0.style.display = "none"; } } if (mw.config.get("wgPageName") === "分类:人物词条") { if (ADMIN) { var h = document.getElementById("firstHeading") || document.querySelector("#content h1"); if (h && h.parentNode) { var box = document.createElement("div"); var nb = document.createElement("button"); nb.textContent = "+ 新建人物"; nb.style.cssText = "margin:8px 0 14px;padding:8px 18px;border:1px solid #9a7425;border-radius:8px;" + "background:rgba(154,116,37,.12);color:#e8c87a;font-size:14px;font-weight:600;cursor:pointer;"; nb.addEventListener("click", function (e) { e.preventDefault(); dyNewPerson(); }); box.appendChild(nb); panelBox = document.createElement("div"); panelBox.style.cssText = "margin:0 0 18px;padding:12px 16px;border:1px dashed rgba(154,116,37,.4);border-radius:10px;"; box.appendChild(panelBox); h.parentNode.insertBefore(box, h.nextSibling); drawPanel(); } } } });
common.json (留言) (翻译) /* 这里的任何JSON将为所有用户在每次页面加载时加载。 */
compare-page1 (留言) (翻译) 页面1
compare-page2 (留言) (翻译) 页面2
compare-rev1 (留言) (翻译) 版本1
compare-rev2 (留言) (翻译) 版本2
首页上一页下一页末页