User:FloweringNight/wikiloveplus.js
外观
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google Chrome、Firefox、Microsoft Edge及Safari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。
(function () {
if (typeof mw === 'undefined' || typeof $ === 'undefined') {
return;
}
// —— 插入全部 CSS —— //
mw.util.addCSS(`
/* ===============================
WikiLoveSakuya - 可滚动侧边栏
=============================== */
/* 遮罩层 */
#wikiLoveSakuya-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0,0,0,0.5);
display: none;
z-index: 9998;
}
/* 弹窗容器:限制高度,内部可滚动 */
#wikiLoveSakuya-container {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 650px;
max-width: 90%;
max-height: 90vh;
overflow: hidden;
background: #fff;
border: 1px solid #a2a9b1;
border-radius: 8px;
display: none;
z-index: 9999;
font-family: sans-serif;
box-shadow: 0 6px 16px rgba(0,0,0,0.2);
}
/* 弹窗头部 */
#wikiLoveSakuya-header {
background: linear-gradient(120deg, #f0f0f0, #f8f9fa);
padding: 10px 16px;
border-bottom: 1px solid #a2a9b1;
border-radius: 8px 8px 0 0;
font-size: 16px;
font-weight: bold;
color: #333;
position: relative;
}
#wikiLoveSakuya-close-button {
position: absolute;
top: 10px;
right: 16px;
border: none;
background: transparent;
font-size: 20px;
cursor: pointer;
color: #666;
}
#wikiLoveSakuya-close-button:hover {
color: #000;
}
/* 主内容区:左右分栏 */
#wikiLoveSakuya-content {
display: flex;
height: calc(100% - 55px);
box-sizing: border-box;
}
#wikiLoveSakuya-sidebar {
width: 35%;
border-right: 1px solid #a2a9b1;
padding: 10px;
background: #fff;
box-sizing: border-box;
max-height: 80vh;
overflow-y: auto;
}
#wikiLoveSakuya-main {
width: 65%;
padding: 15px;
box-sizing: border-box;
}
/* 一级分类 */
.sakuya-category {
border: 1px solid #ddd;
border-radius: 4px;
margin-bottom: 8px;
cursor: pointer;
background: #fff;
padding: 8px 10px;
display: flex;
align-items: center;
transition: background-color 0.2s ease, box-shadow 0.2s ease;
}
.sakuya-category:hover {
background-color: #f0f0f0;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
.sakuya-category-icon {
width: 28px;
height: 28px;
background-size: cover;
background-position: center;
margin-right: 8px;
border-radius: 4px;
}
.sakuya-category-text {
font-size: 14px;
color: #333;
flex: 1;
}
/* 二级子项 */
.sakuya-sublist {
margin-top: 4px;
margin-left: 36px;
display: none;
}
.sakuya-subitem {
margin-bottom: 6px;
padding: 6px 8px;
border: 1px solid #ddd;
border-radius: 4px;
background: #fff;
cursor: pointer;
display: flex;
align-items: center;
transition: background-color 0.2s ease;
}
.sakuya-subitem:hover {
background: #f9f9f9;
}
.sakuya-subitem-icon {
width: 48px;
height: 48px;
background-size: cover;
background-position: center;
margin-right: 8px;
border-radius: 4px;
}
.sakuya-subitem-text {
font-size: 13px;
color: #444;
}
/* 预览区 */
#wikiLoveSakuya-preview {
border: 1px solid #fceb92;
background: #fdffe7;
padding: 10px;
margin-bottom: 12px;
border-radius: 4px;
color: #444;
line-height: 1.4;
}
#wikiLoveSakuya-preview img {
max-width: 150px;
max-height: 150px;
display: block;
margin-top: 6px;
}
/* 表单元素 */
.sakuya-label {
margin-top: 5px;
font-weight: bold;
color: #555;
display: block;
}
#sakuya-recipient,
#sakuya-message {
width: 100%;
box-sizing: border-box;
padding: 8px;
margin-bottom: 10px;
border: 1px solid #ccc;
border-radius: 4px;
}
#sakuya-recipient[readonly] {
background: #eee;
}
#sakuya-send-button {
background: #36c;
color: #fff;
border: none;
padding: 8px 16px;
cursor: pointer;
border-radius: 4px;
}
#sakuya-send-button:hover {
background-color: #2a5298;
}
`);
// —— 插件核心 JS 逻辑 —— //
$(document).ready(function () {
var pageName = mw.config.get('wgPageName') || '';
if (!pageName.startsWith('User_talk:')) {
return;
}
var recipient = pageName.substring(10).replace(/_/g, ' ');
if (recipient === mw.config.get('wgUserName')) {
return;
}
// 在页面工具栏插入按钮
var sakuyaBtn = $('<button>', {
text: '维基友爱Plus',
class: 'mw-ui-button'
});
if ($('#p-cactions ul').length) {
$('#p-cactions ul').append($('<li>').append(sakuyaBtn));
} else if ($('.vector-menu-tabs ul').length) {
$('.vector-menu-tabs ul').append($('<li>').append(sakuyaBtn));
} else {
$('#p-tb ul').append($('<li>').append(sakuyaBtn));
}
// 构建遮罩与弹窗
var overlay = $('<div id="wikiLoveSakuya-overlay"></div>');
var containerHtml = `
<div id="wikiLoveSakuya-container">
<div id="wikiLoveSakuya-header">
给 ${recipient} 送礼物
<button id="wikiLoveSakuya-close-button">×</button>
</div>
<div id="wikiLoveSakuya-content">
<div id="wikiLoveSakuya-sidebar"></div>
<div id="wikiLoveSakuya-main">
<div id="wikiLoveSakuya-preview"></div>
<label class="sakuya-label">收件人:</label>
<input type="text" id="sakuya-recipient" readonly />
<label class="sakuya-label">留言:</label>
<textarea id="sakuya-message"></textarea>
<button id="sakuya-send-button">发送</button>
</div>
</div>
</div>
`;
$('body').append(overlay, containerHtml);
$('#sakuya-recipient').val(recipient);
// 随机节日祝福
var holidayRandomMessages = [
'祝您在佳节度过愉快时光,心想事成!',
'愿节日的喜悦萦绕在您心间,愿一切顺利!',
'真诚地祝愿您在节日期间收获满满的幸福与快乐。',
'让我们在这个时刻共同欢庆,祝您节日充满欢乐!'
];
// 插件配置对象(种类、子项等信息)
var sakuyaConfig = {
barnstar: {
name: "条目贡献星章",
icon: "/media/wikipedia/commons/a/ae/Original_Barnstar_Hires.svg",
subtypes: {
original: {
title: "原星章",
imageLink: "/media/wikipedia/commons/a/ae/Original_Barnstar_Hires.svg",
descr: "这是维基百科的第一枚星章,用来表彰对维基百科有卓越贡献的参与者..."
},
editors: {
title: "编辑星章",
imageLink: "/media/wikipedia/commons/1/19/Editors_Barnstar_Hires.png",
descr: "这个星章用来奖励那些在平常的编辑中具有卓越的判断力的参与者..."
},
minor: {
title: "小星章",
imageLink: "/media/wikipedia/commons/e/e7/Minor_Barnstar_Hires.png",
descr: "小修改常被忽视,但同样做出贡献..."
},
surreal: {
title: "超现实主义星章",
imageLink: "/media/wikipedia/commons/4/49/Surreal_Barnstar_Hires.png",
descr: "超现实星章奖励对维基作出不可思议贡献的维基人..."
},
camera: {
title: "摄影师星章",
imageLink: "/media/wikipedia/commons/4/4a/Photographer_Barnstar.png",
descr: "摄影师星章用来奖励通过摄影技术改善维基百科的人..."
},
writers: {
title: "作家星章",
imageLink: "/media/wikipedia/commons/8/8c/Writers_Barnstar_Hires.png",
descr: "作家星章可颁给对作家、著作类条目有贡献的维基人..."
},
designers: {
title: "绘图师星章",
imageLink: "/media/wikipedia/commons/1/1f/Design_Barnstar_Hires.png",
descr: "绘图师星章奖励制作图表、资料图片的维基人..."
},
audio: {
title: "音频星章",
imageLink: "/media/wikipedia/commons/1/1e/AudioBarnstar.png",
descr: "音频星章可授予上传各种录音、自制音乐、音效文件的维基人..."
},
rosetta: {
title: "译者星章",
imageLink: "/media/wikipedia/commons/b/b8/Rosetta_Barnstar_Hires.png",
descr: "译者星章可用以奖励对维基百科作出优异翻译成就的维基人..."
},
copyeditor: {
title: "校对者星章",
imageLink: "/media/wikipedia/commons/e/ee/Copyeditor_Barnstar_Hires.png",
descr: "校对者星章是为对校对工作作出贡献之人而设..."
},
special: {
title: "特别星章",
imageLink: "/media/wikipedia/commons/e/e4/Special_Barnstar_Hires.png",
descr: "特别星章可以在无其他合适星章时,对特定原因表达谢意..."
},
cleanup: {
title: "清理星章",
imageLink: "/media/wikipedia/commons/e/eb/Cleanup_Barnstar_Hires.png",
descr: "清理星章可奖励在清理工作中做出贡献的维基人..."
},
citation: {
title: "参考星章",
imageLink: "/media/wikipedia/commons/e/eb/Citation_Barnstar_Hires.png",
descr: "参考星章颁给为缺少参考文献的条目加入参考资料的维基人..."
},
antiflame: {
title: "反辱骂星章",
imageLink: "/media/wikipedia/commons/7/77/Antiflame_Barnstar_Hires.png",
descr: "反辱骂星章可颁给在冲突中保持冷静、解决问题的维基人..."
},
compass: {
title: "嚮導星章",
imageLink: "/media/wikipedia/commons/8/8c/Compass_Barnstar_Hires.png",
descr: "嚮導星章可颁给帮助别人找到资料或信息的维基人..."
},
modest: {
title: "棉薄星章",
imageLink: "/media/wikipedia/commons/d/d9/Modest_Barnstar_Hires.png",
descr: "棉薄星章颁给谦虚地为维基百科做贡献的维基人..."
},
teamwork: {
title: "團隊協作星章",
imageLink: "/media/wikipedia/commons/2/27/Team_Barnstar_Hires.png",
descr: "團隊協作星章可颁给共同合作维基百科的维基人..."
},
integrity: {
title: "正直星章",
imageLink: "/media/wikipedia/commons/a/ac/Barnstar_of_Integrity_Hires.png",
descr: "正直星章颁给正直、不偏不倚的维基人..."
},
copyclean: {
title: "版權清理星章",
imageLink: "/media/wikipedia/commons/e/e9/CopyClean_Barnstar_Hires.png",
descr: "版权清理星章可授予在清理版权问题上作出贡献的维基人..."
},
redlink: {
title: "消除红链星章",
imageLink: "/media/wikipedia/commons/5/52/Red_Link_Removal_Barnstar_Hires.png",
descr: "消除红链星章可颁给通过创建条目或修改链接消除红链的维基人..."
},
rescue: {
title: "拯救星章",
imageLink: "/media/wikipedia/commons/6/65/Rescue_Barnstar_Hires.png",
descr: "拯救星章可颁给通过改善条目质量避免条目被删除的人..."
},
recovery: {
title: "抢救星章",
imageLink: "/media/wikipedia/commons/b/bf/Barnstar_of_Recovery_Hires.png",
descr: "抢救星章可颁给使被提删的条目得以保留的维基人..."
},
template: {
title: "模板星章",
imageLink: "/media/wikipedia/commons/2/28/Blueprint_Barnstar_3.PNG",
descr: "模板星章可颁发给创建或改进有用模板的贡献者..."
},
dyk: {
title: "DYK星章",
imageLink: "/media/wikipedia/commons/d/dc/DYK_Barnstar_shiny_Hires.svg",
descr: "DYK星章可颁给积极参与DYK条目申请和投票的编辑者..."
},
technical: {
title: "技術星章",
imageLink: "/media/wikipedia/commons/4/47/Barnstar_-_technical_works.svg",
descr: "技術星章授予协助解决维基技术问题的编者..."
},
afc: {
title: "建立條目專題星章",
imageLink: "/media/wikipedia/commons/8/85/AFC-Barnstar-2.png",
descr: "建立条目专题星章可授予在创建条目专题中贡献突出的维基人..."
}
}
},
Administrationstar: {
name: "站务星章",
icon: "/media/wikipedia/commons/9/9a/Administrator_Barnstar_Hires.png",
subtypes: {
administrator: {
title: "管理员星章",
imageLink: "/media/wikipedia/commons/9/9a/Administrator_Barnstar_Hires.png",
descr: "管理员星章是为尽责的管理员而设。他们可以是常常为非常困难的问题作决定、处理非常繁重的管理员工作及/或积压工作,或只是在特定负责的管理员工作中表现出色,被受赞赏。"
},
interfaceAdmin: {
title: "界面管理员星章",
imageLink: "/media/wikipedia/commons/0/0b/Interface_administrator_Barnstar.png",
descr: "界面管理员星章授予在用户界面、脚本与样式等技术支持方面作出突出贡献的界面管理员。"
},
bureaucrat: {
title: "行政员星章",
imageLink: "/media/wikipedia/commons/6/6a/Bureaucrat_Barnstar.png",
descr: "行政员星章表彰在权限管理、流程协调等方面展现高度公正与效率的行政员。"
},
patroller: {
title: "巡查星章",
imageLink: "/media/wikipedia/commons/0/0f/Patroll_Barnstar.png",
descr: "巡查星章授予积极参与页面巡查、新条目维护并即时处理问题内容的维基人。"
},
rollback: {
title: "回退星章",
imageLink: "/media/wikipedia/commons/4/48/Rollback_Barnstar.png",
descr: "回退星章表彰运用回退工具及时反破坏、维护页面稳定性的维基人。"
},
npp: {
title: "新页面巡查星章",
imageLink: "/media/wikipedia/commons/7/7d/NPPbarnstar.jpg",
descr: "新页面巡查星章授予在审查新条目质量、清理不当内容方面积极参与的维基人。"
},
reversion: {
title: "反破坏星章",
imageLink: "/media/wikipedia/commons/d/d2/Barnstar_of_Reversion_Hires.png",
descr: "反破坏星章奖励致力于防止和修复破坏的维基人,他们努力保护维基百科质量,让其他维基人能无忧无虑的编辑。"
},
defender: {
title: "护卫星章",
imageLink: "/media/wikipedia/commons/e/e4/WikiDefender_Barnstar_Hires.png",
descr: "护卫星章颁发给那些在维基面对外部挑战或内部冲突时挺身而出的维基人。"
},
tech: {
title: "达芬奇星章",
imageLink: "/media/wikipedia/commons/c/c9/Vitruvian_Barnstar_Hires.png",
descr: "达芬奇星章表彰在技术支持、程序开发、模板维护等方面持续贡献的维基人。"
},
workingMan: {
title: "机器人星章",
imageLink: "/media/wikipedia/commons/9/9d/Working_Wikimedian%27s_Barnstar_Hires.png",
descr: "机器人星章奖励在维基百科中操作、审查、运行、维护机器人和自动化代码的维基人。."
},
mainpage: {
title: "首页星章",
imageLink: "/media/wikipedia/commons/a/a2/Main_Barnstar_Hires.png",
descr: "首页星章授予参与首页内容维护、更新与美化工作的维基人。"
},
commons: {
title: "共享资源星章",
imageLink: "/media/wikipedia/commons/d/d4/Commons_Barnstar_Hires.png",
descr: "共享资源星章奖励积极上传、整理自由版权资源以丰富内容的维基人。"
},
shenKuo: {
title: "沈括星章",
imageLink: "/media/wikipedia/commons/a/a8/Traditional_and_Simplified_Barnstar_Hires.svg",
descr: "沈括星章授予致力于繁简转换、语言适配与技术修复工作的维基人。"
},
reviewer: {
title: "审阅者星章",
imageLink: "/media/wikipedia/commons/d/d1/Review_Barnstar_Hires.png",
descr: "审阅者星章表彰对条目评级、结构审核和分类归整等方面投入精力的维基人。"
},
evaluation: {
title: "评选星章",
imageLink: "/media/wikipedia/commons/2/29/Barnstar_of_Democracy.png",
descr: "评选星章授予在优良条目、特色条目等提名与讨论过程中作出积极贡献的维基人。"
},
afc: {
title: "建立条目星章",
imageLink: "/media/wikipedia/commons/8/85/AFC-Barnstar-2.png",
descr: "建立条目星章颁发给在条目创建、草稿推进与新手帮助方面表现出色的维基人。"
}
}
},
nationstar: {
name: "国家/地区星章",
icon: "/media/wikipedia/commons/8/83/Environment_Barnstar_new.png",
subtypes: {
china: {
title: "中华人民共和国星章",
imageLink: "/media/wikipedia/commons/7/7e/BoNM_-_People%27s_Republic_of_China_Hires.png",
descr: "中华人民共和国星章授予在促进中国文化传播和知识分享方面做出杰出贡献的维基人。"
},
taiwan: {
title: "台湾星章",
imageLink: "/media/wikipedia/commons/3/35/Taiwan_Barnstar_%28%E4%B8%AD%E6%96%87%E7%B6%AD%E5%9F%BA%29.png",
descr: "台湾星章授予对台湾相关条目完善作出卓越贡献的维基人。"
},
hongKong: {
title: "香港星章",
imageLink: "/media/wikipedia/commons/c/c9/Hong_Kong_medal.svg",
descr: "香港星章授予在维护和丰富香港相关内容方面表现突出的维基人。"
},
usa: {
title: "美国星章",
imageLink: "/media/wikipedia/commons/f/f0/American_Gold_Barnstar.svg",
descr: "美国星章授予对美国历史和文化条目进行深入研究和完善的维基人。"
},
japan: {
title: "樱花星章",
imageLink: "/media/wikipedia/commons/b/b4/BarnSakura.svg",
descr: "日本星章授予在介绍日本文化和历史方面贡献突出的维基人。"
},
eu: {
title: "欧盟星章",
imageLink: "/media/wikipedia/commons/6/67/BoNM_-_European_Union_Hires.png",
descr: "欧盟星章授予对欧洲联盟事务和成员国条目做出重要贡献的维基人。"
},
russia: {
title: "俄罗斯星章",
imageLink: "/media/wikipedia/commons/3/33/Russia_Barnstar.png",
descr: "俄罗斯星章授予在扩展和修订俄罗斯相关条目方面具有突出贡献的维基人。"
},
asia: {
title: "亚洲奖章",
imageLink: "/media/wikipedia/commons/f/fa/Asia_medal.svg",
descr: "亚洲星章授予在推广亚洲地区多元文化和历史资料方面表现优秀的维基人。"
},
africa: {
title: "非盟星章",
imageLink: "/media/wikipedia/commons/6/6f/BoNM_-_African_Union_Hires.png",
descr: "非洲星章授予对非洲国家和文化条目给予深入研究和修订的维基人。"
},
southeastAsia: {
title: "东盟星章",
imageLink: "/media/wikipedia/commons/c/ca/BoNM_-_Asean_Hires.png",
descr: "东南亚星章授予对东南亚地区条目进行系统整理和扩充的维基人。"
},
uk: {
title: "大英星章",
imageLink: "/media/wikipedia/commons/9/96/United_Kingdom_Gold_Barnstar.svg",
descr: "英国星章授予在完善英国历史和文化条目方面表现优异的维基人。"
},
france: {
title: "法国星章",
imageLink: "/media/wikipedia/commons/e/e7/France_Barnstar.png",
descr: "法国星章授予对法国语言和文化条目进行深入编辑的维基人。"
},
germany: {
title: "德国星章",
imageLink: "/media/wikipedia/commons/6/67/Germany_Barnstar.png",
descr: "德国星章授予在扩展德国历史和社会条目方面作出重要贡献的维基人。"
},
canada: {
title: "枫叶星章",
imageLink: "/media/wikipedia/commons/4/4f/Red_wiki-maple_leaf.png",
descr: "加拿大星章授予对加拿大各领域条目丰富和完善做出杰出贡献的维基人。"
},
turkey: {
title: "土耳其星章",
imageLink: "/media/wikipedia/commons/3/38/Turkey_Barnstar.png",
descr: "土耳其星章授予在改进土耳其相关条目和资料方面表现突出的维基人。"
},
poland: {
title: "波兰星章",
imageLink: "/media/wikipedia/commons/8/8e/Poland_Barnstar.png",
descr: "波兰星章授予对波兰历史和文化条目进行深入编辑的维基人。"
},
czech: {
title: "捷克星章",
imageLink: "/media/wikipedia/commons/5/53/Czech_Republic_Barnstar.png",
descr: "捷克星章授予在完善捷克相关内容方面做出卓越贡献的维基人。"
},
nationalMerit: {
title: "国家功绩星章",
imageLink: "/media/wikipedia/commons/b/b4/BoNM_Hires.png",
descr: "国家功绩星章授予对国家或地区发展做出重大贡献的维基人。"
},
EarthMerit: {
title: "蓝星星章",
imageLink: "/media/wikipedia/commons/9/92/Earth_Barnstar.png",
descr: "为了地球!"
},
crossStrait: {
title: "两岸团结星章",
imageLink: "/media/wikipedia/commons/5/54/Chinese_Unity_Barnstar_of_National_Merit.png",
descr: "两岸团结星章授予在促进海峡两岸交流与合作方面做出卓越贡献的维基人。"
}
}
},
food: {
name: '饮食菜单',
icon: '/media/wikipedia/commons/b/ba/Export_hell_seidel_steiner.png',
subtypes: {
beer: {
title: '慕尼黑啤酒',
imageLink: '/media/wikipedia/commons/b/ba/Export_hell_seidel_steiner.png',
descr: '这是一杯风味独特的慕尼黑啤酒,让我们共同举杯庆祝编辑的成果。'
},
baklava: {
title: '果仁蜜饼',
imageLink: '/media/wikipedia/commons/8/8f/Baklava_-_Turkish_special%2C_80-ply.JPEG',
descr: '果仁蜜饼拥有浓郁甜蜜的口感,希望这份甜美为您的维基编辑带来更多灵感!'
},
brownie: {
title: '布朗尼',
imageLink: '/media/wikipedia/commons/e/e9/Brownie_transparent.png',
descr: '布朗尼是富有巧克力风味的小蛋糕,为您的编辑之路增添一抹甜蜜的能量。'
}
}
},
holiday: {
name: '节日祝福',
icon: '/media/wikipedia/commons/b/bd/Wikipe-tan_in_Santa_Costume.png',
subtypes: {
christmas: {
title: '圣诞节',
imageLink: '/media/wikipedia/commons/b/bd/Wikipe-tan_in_Santa_Costume.png',
customTemplate: `== [[圣诞节]]快乐! ==
{| style="background-color: #013220; border: 8px solid; border-image: repeating-linear-gradient(45deg, #c80101, #c80101 10px, #FFFFFF 10px, #FFFFFF 20px) 1; border-radius:8px; padding:10px; position:relative; overflow:hidden;"
| style="vertical-align: middle; padding:5px;" | [[File:Wikipe-tan_in_Santa_Costume.png|100px]]
| style="vertical-align: middle; padding:3px; position:relative;" |
<span style="color:white;"><big><big>'''亲爱的{{Ping|$USER}},'''</br></big></big>$MESSAGE</br></br>\u007E\u007E\u007E\u007E</span>
<noinclude></noinclude>~~
<span style="
position:absolute;
bottom:50px;
right:-30px;
background: linear-gradient(135deg, #A30000, #D40000, #A30000);
width:220px;
height:22px;
box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.5),
inset -1px -1px 2px rgba(255, 255, 255, 0.3),
inset 1px 1px 2px rgba(0, 0, 0, 0.5);
border-radius:5px;
transform: rotate(-45deg);
transform-origin: right bottom;">
</span>
|}`
},
newyear: {
title: '元旦',
imageLink: '/media/wikipedia/commons/1/17/Wikipe-tan_2025_New_Year.svg',
customTemplate: `== [[元旦]]快乐! ==
{| style="background-color: #f8e7d8; border: 8px solid; border-image: repeating-linear-gradient(45deg, #FFD700, #FFA500 20%, #FFD700 40%, #FFA500 60%, #FFD700 80%, #FFA500 100%) 1; border-radius:8px; padding:10px; width:550px; height:220px; position:relative; overflow:hidden; box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.2); box-sizing: border-box;"
| style="vertical-align: middle; padding:3px; position:relative;" |
<span style="
position:absolute;
top:10%;
left:0%;
width:35%;
height:auto;">
[[File:Wikipe-tan_holding_sign.png|200px|alt=图片]]
</span>
<span style="color:#8B0000; font-size:13px; position:absolute; top:20%; right:5%; width:55%; text-align:justify;">
<big><big>'''亲爱的{{Ping|$USER}},'''</br></big></big>$MESSAGE</br></span>
<span style="
position:absolute;
top:calc(33% + 100px);
left:calc(-0.4% + 100px);
transform:translate(-50%, -50%);
font-size:48px;
font-weight:bold;
background: linear-gradient(45deg, #FFD700, #d82e2a);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
text-shadow: 0px 2px 4px rgba(255, 165, 0, 0.8), 0px 0px 10px rgba(255, 215, 0, 0.9), 0px 0px 30px rgba(255, 215, 0, 1);
font-family: Arial, sans-serif;
padding:1px;">
2025
</span>
<span style="
position:absolute;
bottom:70px;
right:-50px;
background: linear-gradient(135deg, #FFD700, #FFA800, #FFD700);
width:320px;
height:25px;
box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.3),
inset -1px -1px 2px rgba(255, 255, 255, 0.3),
inset 1px 1px 2px rgba(0, 0, 0, 0.3);
border-radius:52px;
transform: rotate(-45deg);
transform-origin: right bottom;">
</span>
|}\u007E\u007E\u007E\u007E`
},
springfestival: {
title: '春节',
imageLink: '/media/wikipedia/commons/f/ff/%E4%B9%99%E5%B7%B3%E6%96%B0%E5%B9%B4%E6%A8%99%E8%AA%8C_v2.svg',
customTemplate: `== 新春快乐! ==
{| style="background: radial-gradient(circle, #f8e7d8, #f8d8b2); border: 8px solid; border-image: repeating-linear-gradient(45deg, #be3cb7, #ff4c52 20%, #ffce49 40%, #fd6a6d 60%, #f00719 80%, #be3cb7 100%) 1; border-radius:8px; padding:10px; width:550px; height:220px; position:relative; overflow:hidden; box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.2); box-sizing: border-box;"
| style="vertical-align: middle; padding:3px; position:relative;" |
<span style="
position:absolute;
top:88%;
left:65%;
width:35%;
height:auto;
transform:translate(-50%, -50%);
opacity:0.3;
">
[[File:乙巳新年標誌_v2.svg|175px|alt=图片|link=]]
</span>
<span style="color:#8B0000; font-size:13px; position:absolute; top:20%; right:5%; width:55%; text-align:justify;">
</span>
<span style="position:absolute; top:-3%; left:0%; color:#ffffff;font-family: 'Arial', 'Helvetica', sans-serif; font-weight: 400; font-size:2.2em; text-shadow:2px 2px 4px rgba(0,0,0,0.3);"><span style="color:#8B0000;">亲爱的[[User:$USER|<span style="color:#8B0000;">$USER]],</span></span>
<span style="position:absolute; top:27%; left:2%; color:#ffffff; font-family: 'Arial', 'Helvetica', sans-serif; font-weight: 300; font-size:0.95em; text-shadow:2px 2px 4px rgba(0,0,0,0.3);"><span style="color:#8B0000;">岁值乙巳,蜕旧启新。诸君秉烛修典,不觉时光荏苒,甲谢辰藏。今欣逢新春,衔珠纳瑞,趋谒雅居,敬祝阁下:</br>笔走龙蛇,良典佳作日日有;</br>简传今古,真知灼见代代承!</br>$MESSAGE\u007E\u007E\u007E敬上</span>
<span style="
position:absolute;
bottom:70px;
right:-50px;
background: linear-gradient(135deg, #f0091b, #ca3fa4, #FFD700);
width:320px;
height:25px;
box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.3),
inset -1px -1px 2px rgba(255, 255, 255, 0.3),
inset 1px 1px 2px rgba(0, 0, 0, 0.3);
border-radius:52px;
transform: rotate(-45deg);
transform-origin: right bottom;">
</span>
|}\u007E\u007E\u007E\u007E `
}
}
}
};
// 构建侧边栏菜单
var currentlyOpen = null;
var sidebar = $('#wikiLoveSakuya-sidebar');
Object.keys(sakuyaConfig).forEach(function (catKey) {
var catData = sakuyaConfig[catKey];
var catDiv = $('<div>', { class: 'sakuya-category' }).append(
$('<div>', { class: 'sakuya-category-icon' }).css('background-image', 'url("' + catData.icon + '")'),
$('<div>', { class: 'sakuya-category-text', text: catData.name })
);
var subList = $('<div>', { class: 'sakuya-sublist' });
Object.keys(catData.subtypes).forEach(function (subKey) {
var subObj = catData.subtypes[subKey];
var subItem = $('<div>', { class: 'sakuya-subitem' }).append(
$('<div>', { class: 'sakuya-subitem-icon' }).css('background-image', 'url(\"' + subObj.imageLink + '\")'),
$('<div>', { class: 'sakuya-subitem-text', text: subObj.title })
);
subItem.on('click', function (e) {
e.stopPropagation();
selectItem(catKey, subKey);
});
subList.append(subItem);
});
catDiv.on('click', function () {
if (currentlyOpen === catKey) {
subList.slideUp();
currentlyOpen = null;
} else {
if (currentlyOpen) sidebar.find('.sakuya-sublist').slideUp();
subList.slideDown();
currentlyOpen = catKey;
}
});
sidebar.append(catDiv, subList);
});
// 记录当前选择
var currentSelected = { category: '', subtype: '' };
function selectItem(catKey, subKey) {
currentSelected.category = catKey;
currentSelected.subtype = subKey;
var subObj = sakuyaConfig[catKey].subtypes[subKey];
var preview = $('#wikiLoveSakuya-preview');
if (subObj.customTemplate) {
preview.html('<strong>' + subObj.title + '(节日模板)</strong><br><img src="' + subObj.imageLink + '" alt="节日图">');
} else {
preview.html('<strong>' + subObj.title + '</strong><br><img src="' + subObj.imageLink + '" alt="预览图"><p>' + subObj.descr + '</p>');
}
}
// 打开/关闭弹窗
sakuyaBtn.on('click', function () {
overlay.show();
$('#wikiLoveSakuya-container').show();
});
$('#wikiLoveSakuya-close-button').on('click', function () {
overlay.hide();
$('#wikiLoveSakuya-container').hide();
});
overlay.on('click', function (e) {
if (e.target === this) {
overlay.hide();
$('#wikiLoveSakuya-container').hide();
}
});
// 发送消息
$('#sakuya-send-button').on('click', function () {
var recpt = $('#sakuya-recipient').val().trim();
var userMsg = $('#sakuya-message').val().trim();
if (!recpt) return alert('请先确认收件人。');
if (!currentSelected.category || !currentSelected.subtype) return alert('请选择一个分类和子项。');
var catData = sakuyaConfig[currentSelected.category];
var subObj = catData.subtypes[currentSelected.subtype];
var finalMsg = userMsg || (subObj.customTemplate ? holidayRandomMessages[Math.floor(Math.random() * holidayRandomMessages.length)] : subObj.descr);
var finalText;
if (subObj.customTemplate) {
finalText = subObj.customTemplate.replace(/\$USER/g, recpt).replace(/\$MESSAGE/g, finalMsg);
} else {
var fileName = subObj.imageLink.split('/').pop();
finalText = '== 送您' + subObj.title + '!==\n\n{| style="background-color: #fdffe7; border: 1px solid #fceb92;"\n|rowspan="2" style="vertical-align: middle; padding: 5px;" | [[File:' + fileName + '|100px|alt=' + subObj.title + ']]\n|style="font-size: x-large; padding: 3px 3px 0 3px; height: 1.5em;" | \'\'\'' + subObj.title + '\'\'\'\n|-\n|style="vertical-align: middle; padding: 3px;" | ' + finalMsg + '\u007E\u007E\u007E\u007E\n|}';
}
var targetPage = 'User_talk:' + recpt;
var summary = '维基友爱Plus: ' + subObj.title;
var api = new mw.Api();
api.get({ action: 'query', meta: 'tokens', type: 'csrf' }).done(function (data) {
api.post({
action: 'edit',
title: targetPage,
appendtext: '\n' + finalText,
summary: summary,
token: data.query.tokens.csrftoken,
formatversion: 2
}).done(function (resp) {
if (resp.edit && resp.edit.result === 'Success') {
alert('已成功发送!');
// 隐藏遮罩和弹窗
overlay.hide();
$('#wikiLoveSakuya-container').hide();
// 重置内容
$('#sakuya-message').val('');
$('#wikiLoveSakuya-preview').empty();
currentSelected = { category: '', subtype: '' };
} else {
alert('发送失败。可能是您的账户被封禁,也可能是您的账户不是自动确认用户或更高等级,或者您没能成功加载本插件。请参见错误信息,然后联系@花开夜:' + JSON.stringify(resp));
}
}).fail(function () {
alert('无法提交API请求。');
});
}).fail(function () {
alert('无法获取CSRF令牌。');
});
});
});
})();