BWiki工具列表: List Util

为bwiki提供一个快捷工具栏,可以操作当前页面、快速进入其他常见页面。实现简单便于DIY。

// ==UserScript==
// @name         BWiki工具列表: List Util
// @version      1.0.1
// @description  为bwiki提供一个快捷工具栏,可以操作当前页面、快速进入其他常见页面。实现简单便于DIY。
// @author       Lu
// @match        *://wiki.biligame.com/*
// @exclude      *://wiki.biligame.com/*/api.php*
// @namespace    https://greasyfork.org/users/416853
// @license CC BY-SA
// ==/UserScript==

console.log("List Util: 开始加载")

/* 小工具的HTML部分,基于BWiki使用的 bootstrap 中的 btn-group 实现 */
let innerHTML = `
<style>
    #list_util{
        position: fixed;
        top: 10px;
        left: 10px;
        z-index: 1501; /* 因为BWiki部分组件的 z-index 为令人迷惑的1500 */
    }
    #list_util .dropdown-menu{
        min-width:80px;
        left: 0;
        top: 30px;
    }
    #list_util .lu-btn{
        padding: 5px;
        color: #1FABE4; /* 从bili logo 取色 */
    }
</style>
<div id="list_util" class="btn-group" role="group">
    <!-- 用户 相关页面 -->
    <div class="btn-group">
        <button class="lu-btn btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">
            <span class="glyphicon glyphicon-user"></span>
        </button>
        <ul class="dropdown-menu">
            <li><a id="lu-user" accesskey="u">用户页面</a></li>
            <li><a id="lu-preferences" accesskey=""></span> 参数设置</a></li>
            <li><a id="lu-watchlist">监视列表</a></li>
            <li role="separator" class="divider"></li>
            <li><a id="lu-mycontris">我的贡献</a></li>
        </ul>
    </div>
    <!-- 特殊页面 -->
    <div class="btn-group">
        <button class="lu-btn btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">
            <span class="glyphicon glyphicon-tasks"></span>
        </button>
        <ul class="dropdown-menu">
            <li><a id="lu-specialpages"> 特殊页面</a></li>
            <li><a id="lu-recentchanges"> 最近更改</a></li>
            <li><a id="lu-allPages"> 所有页面</a></li>
            <li><a id="lu-filelist"> 文件列表</a></li>
            <li><a id="lu-contriscore"> 贡献得分</a></li>
            <li role="separator" class="divider"></li>
            <li><a id="lu-templates"> 模板</a></li>
            <li><a id="lu-modules"> 模块</a></li>
        </ul>
    </div>
    <!-- Wiki 设置和管理 -->
    <div class="btn-group">
        <button class="lu-btn btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">
            <span class="glyphicon glyphicon-cog"></span>
        </button>
        <ul class="dropdown-menu">
            <li><a id="lu-moderation"> 版主审核</a></li>
            <li><a id="lu-comments"> 管理评论</a></li>
            <li><a id="lu-userrights"> 用户权限</a></li>
            <li role="separator" class="divider"></li>
            <li><a id="lu-Commoncss" href="MediaWiki:Common.css" target="_blank"> 通用css</a></li>
            <li><a id="lu-Commonjs" href="MediaWiki:Common.js" target="_blank"> 通用js</a></li>
            <li><a id="lu-Sitenotice" href="Mediawiki:Sitenotice" target="_blank"> 整站通告定义</a></li>
            <li><a id="lu-Sidebar" href="MediaWiki:Sidebar" target="_blank"> 导航栏定义</a></li>
            <li><a id="lu-Gadgets" href="MediaWiki:Gadgets-definition" target="_blank"> 小组件定义</a></li>
            <li role="separator" class="divider"></li>
            <li><a id="lu-Newarticletext" href="MediaWiki:Newarticletext" target="_blank"> 新页面提示</a></li>
            <li><a id="lu-Editnotice0" href="MediaWiki:Editnotice-0" target="_blank"> 页面修改提示</a></li>
            <li><a id="lu-Deletereason" href="MediaWiki:Deletereason-dropdown" target="_blank"> 页面删除原因</a></li>
            <li><a id="lu-Protect" href="MediaWiki:Protect-dropdown" target="_blank"> 页面保护原因</a></li>
            <li><a id="lu-Copyrightwarning2" href="MediaWiki:Copyrightwarning2" target="_blank"> 页面编辑版权警示</a></li>
            <li><a id="lu-Summary" href="MediaWiki:Summary" target="_blank"> 页面修改摘要</a></li>
            <li><a id="lu-Uploadtext" href="MediaWiki:Uploadtext" target="_blank"> 文件上传提示</a></li>
            <li><a id="lu-Licenses" href="MediaWiki:Licenses" target="_blank"> 文件上传协议</a></li>
            <li><a id="lu-Filedelete" href="MediaWiki:Filedelete-reason-dropdown" target="_blank"> 文件删除原因</a></li>
        </ul>
    </div>
    <!-- 页面相关操作 -->
    <div class="btn-group">
        <button class="lu-btn btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">
            <span class="glyphicon glyphicon-edit"></span>
        </button>
        <ul class="dropdown-menu">
            <li><a id="lu-edit"> 编辑  (Shift+Alt+E)</a></li>
            <li><a id="lu-history"> 历史  (Shift+Alt+H)</a></li>
            <li><a id="lu-sortlink"> 短链接</a></li>
            <li role="separator" class="divider"></li>
            
            <li><a id="lu-purge"> 刷新</a></li>
            <li><a id="lu-protect"> 保护</a></li>
            <li><a id="lu-delete"> 删除  (Shift+Alt+D)</a></li>
            <li role="separator" class="divider"></li>
            
            <li><a id="lu-linkshere"> 入链</a></li>
            <li><a id="lu-relatedchanges"> 相关更改</a></li>
            <li role="separator" class="divider"></li>
            
            <li><a id="lu-watch"> 监视</a></li>
            <li><a id="lu-unwatch"> 取消监视</a></li>
            <li><a id="lu-log"> 日志</a></li>
            <li><a id="lu-info"> 信息</a></li>
            <li><a id="lu-properties"> 属性</a></li>
            <li role="separator" class="divider"></li>
        </ul>
    </div>
</div>
`;

/* 当前 wiki 的 url */
var wikiurl = "https://wiki.biligame.com/" + mwcfg("wgGameName") + "/";

function mwcfg(key){/* 按key从mediaWiki获取配置 */
    return mediaWiki.config.get(key);
}

function open(url) {/* 在新页面打开url */
    window.open(url, '_blank').focus();
}

function onclick(elm_id, func) {/* 为ID元素增加点击事件 */
    document.getElementById(elm_id).addEventListener("click", func);
}

function linkto(elm_id, url) {/* 为某ID的A元素增加href */
    document.getElementById(elm_id).href = wikiurl + url;
    document.getElementById(elm_id).target = '_blank';
}

function addClickEvents(){ /* 为所有列表项添加A标签的href链接 */
    var username = mwcfg("wgUserName");
    var pagename = mwcfg("wgPageName");
    var pageid = mwcfg("wgArticleId");

    linkto("lu-user","用户:" + username);
    linkto("lu-preferences","特殊:参数设置");
    linkto("lu-mycontris","特殊:用户贡献/" + username);
    linkto("lu-watchlist","特殊:监视列表");


    linkto("lu-specialpages","特殊:特殊页面");
    linkto("lu-recentchanges","特殊:最近更改");
    linkto("lu-allPages","特殊:所有页面");
    linkto("lu-filelist","特殊:文件列表");
    linkto("lu-contriscore","特殊:贡献得分");

    linkto("lu-templates","特殊:模板");
    linkto("lu-modules","特殊:所有页面?namespace=828");
    linkto("lu-moderation","特殊:Moderation");
    linkto("lu-comments","特殊:管理FlowThread评论");
    linkto("lu-userrights","特殊:用户权限");

    linkto("lu-purge",pagename + "?action=purge");
    linkto("lu-edit",pagename + "?action=edit");
    linkto("lu-delete",pagename + "?action=delete");
    linkto("lu-protect",pagename + "?action=protect");
    linkto("lu-history",pagename + "?action=history");
    linkto("lu-watch",pagename + "?action=watch");
    linkto("lu-unwatch",pagename + "?action=unwatch");
    linkto("lu-info",pagename + "?action=info");

    linkto("lu-sortlink","?curid=" + pageid);
    linkto("lu-linkshere","特殊:链入页面/" + pagename);
    linkto("lu-relatedchanges","Special:最近链出更改?target=" + pagename);
    linkto("lu-log","Special:日志?page=" + pagename);
    linkto("lu-properties","特殊:浏览/" + pagename);

    linkto("lu-Commoncss","MediaWiki:Common.css");
    linkto("lu-Commonjs","MediaWiki:Common.js");
    linkto("lu-Sitenotice","MediaWiki:Sitenotice");
    linkto("lu-Sidebar","MediaWiki:Sidebar");
    linkto("lu-Gadgets","MediaWiki:Gadgets-definition");
    linkto("lu-Newarticletext","MediaWiki:Newarticletext");
    linkto("lu-Editnotice0","MediaWiki:Editnotice-0");
    linkto("lu-Deletereason","MediaWiki:Deletereason-dropdown");
    linkto("lu-Protect","MediaWiki:Protect-dropdown");
    linkto("lu-Copyrightwarning2","MediaWiki:Copyrightwarning2");
    linkto("lu-Summary","MediaWiki:Summary");
    linkto("lu-Uploadtext","MediaWiki:Uploadtext");
    linkto("lu-Licenses","MediaWiki:Licenses");
    linkto("lu-Filedelete","MediaWiki:Filedelete-reason-dropdown");
}

function main(){
    /* main part */
    try { // statements to try
        console.log('开始初始化 List Util ');

        let need_tool = document.getElementsByClassName("mediawiki").length;
        if (need_tool > 0){
            var html = document.createElement('div');
            html.innerHTML = innerHTML
            document.body.appendChild(html);

            addClickEvents();

            // 为列表中的 短链接 文字后边添加 页面id
            document.getElementById("lu-sortlink").innerHTML += " ("+ mwcfg("wgArticleId") + ")";

            // 在控制台显示加载完成
            console.log("%c power by tampermonkey %c ListUtil 加载完成 %c create by Lu (39886146)",
                "padding: 3px; font-size:0.8em;  background: #FFE1AB;",
                "color: #fff; padding: 10px 10px; background: #FF8E00;",
                "padding: 3px; background: #FFE1AB;");

            /* fix .dropdown-menu css.
               The BwikiBatchEditor remiss set css for all .dropdown-menu
               Solution is :
                   when "#list_util .btn" is click, clear inline css for "#list_util .dropdown-menu".
            */
            const lu_buttons = document.querySelectorAll('#list_util .btn');
            lu_buttons.forEach(lu_btn => {
                lu_btn.addEventListener('click', function(){
                    document.querySelectorAll('#list_util .dropdown-menu').forEach(menu => { menu.style=""; });
                });
            });
        }else{
            console.log('未找到 mediawiki class 页面,不加载 ListUtil ');
        }
    }catch (e) {
        console.log("List Util 遇到错误,异常退出……")
        console.log("List Util 遇到的错误是:")
        console.log(e)
        try {
            document.getElementById("list_util").outerHTML = "";
        }catch (e) {}
    }
}

// 入口
setTimeout(function (){
    main();
}, 500); // timeout 是为了等待 mw 加载,否则会偶见无法获取 mw 。