打开/关闭菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

用户:UnownHearn/common.js:修订间差异

(忘了删 console.log)
无编辑摘要
第2行: 第2行:


/**
/**
  * 去掉内容与链接文本相同的 popup
  * 在鼠标移至文本与标题不同的 wikilink 上时, 弹出带有原标题的 popup
  * @author [[User:UnownHearn]]
  * @author [[User:UnownHearn]]
  * @version 1 (2018/07/28)
  * @version 1 (2018/07/28)
第29行: 第29行:
* 自动转换链接
* 自动转换链接
* @author [[User:UnownHearn]]
* @author [[User:UnownHearn]]
* @version 1.4 (2019/03/18)
* @version 1.5 (2019/03/20)
*/
*/
(function () { /* 自动链接 */
(function () { /* 自动链接 */
第45行: 第45行:


     var rules = [{
     var rules = [{
         // id: ["sm", "nm"],
         // 两字母 + 一串数字
         regex: /(sm|nm|im|av|ac)\d+/g,
         regex: /[a-zA-Z]{2}\d+/g,
         link: function (text) {
         link: function (text) {
            var base;
             switch (text.slice(0, 2)) {
             switch (text.slice(0, 2)) {
                 case "sm": case "nm":
                // niconico 主要
                    return "https://www.nicovideo.jp/watch/" + text;
                 case "sm": case "nm": base = "https://www.nicovideo.jp/watch/"; break;
                 case "im":
                 case "im": base = "https://seiga.nicovideo.jp/seiga/"; break;
                    return "https://seiga.nicovideo.jp/seiga/" + text;
                // bilibili
                 case "av":
                 case "av": base = "https://www.bilibili.com/video/"; break;
                    return "https://www.bilibili.com/video/" + text;
                case "cv": /*专栏*/ base = "https://www.bilibili.com/read/"; break;
                 case "ac":
                case "am": /*音频*/ base = "https://www.bilibili.com/audio/"; break;
                    return "http://www.acfun.cn/v/" + text;
                // acfun
                 case "ac": base = "http://www.acfun.cn/v/"; break;
                // niconico 其他, 参考: https://dic.nicovideo.jp/a/nico.ms
                case "sg": case "mg": case "bk": /*静画*/ base = "https://seiga.nicovideo.jp/watch/"; break;
                case "lv": /*生放送*/ base = "https://live.nicovideo.jp/watch/"; break;
                /* l/co 略去 */
                case "co": /*社区*/ base = "https://com.nicovideo.jp/community/"; break;
                case "ch": /*频道*/ base = "https://ch.nicovideo.jp/channel/"; break;
                case "ar": /*频道文章*/ base = "https://ch.nicovideo.jp/article/"; break;
                case "nd": /*直贩*/ base = "https://chokuhan.nicovideo.jp/products/detail/"; break;
                /* 市场略去 */
                case "ap": /*应用*/ base = "https://app.nicovideo.jp/app/"; break;
                case "jk": /*实况*/ base = "https://jk.nicovideo.jp/watch/"; break;
                case "nc": /*共有*/ base = "https://www.niconicommons.jp/material/"; break;
                case "nw": /*新闻*/ base = "https://news.nicovideo.jp/watch/"; break;
             }
             }
            if (base !== undefined) { return base + text; }
            return false;
         }
         }
     }, {
     }, {
         // id: ["mylist", "user"],
         // niconico mylist/ 及 user/
         regex: /(mylist|user)\/\d+/g,
         regex: /(mylist|user)\/\d+/g,
         link: "https://www.nicovideo.jp/{}"
         link: "https://www.nicovideo.jp/{}"
第81行: 第98行:
         for (var ruleIndex in rules) {
         for (var ruleIndex in rules) {
             var rule = rules[ruleIndex];
             var rule = rules[ruleIndex];
             html = html.replace(rule.regex, function (old) {
             html = html.replace(rule.regex, function (text) {
                 var link;
                 var link;
                 if (typeof rule.link === "function") {
                 if (typeof rule.link === "function") {
                     link = rule.link(old);
                     link = rule.link(text);
                    if (link === false) { //< 如果返回 false, 代表并并未匹配到链接, 保留原文
                        return text;
                    }
                 } else {
                 } else {
                     link = rule.link.replace("{}", old);
                     link = rule.link.replace("{}", text);
                 }
                 }
                 return "<a class=\"autolink\" href=\"" + link + "\">" +
                 return "<a class=\"autolink\" href=\"" + link + "\">" +
                     old + "</a>";
                     text + "</a>";
             });
             });
         }
         }

2019年3月20日 (三) 20:36的版本

"use strict";

/**
 * 在鼠标移至文本与标题不同的 wikilink 上时, 弹出带有原标题的 popup
 * @author [[User:UnownHearn]]
 * @version 1 (2018/07/28)
*/
(function () {
    // https://stackoverflow.com/questions/14346414/how-do-you-do-html-encode-using-javascript
    function htmlEncode(value) {
        //create a in-memory div, set it's inner text(which jQuery automatically encodes)
        //then grab the encoded contents back out.  The div never exists on the page.
        return $('<div/>').text(value).html();
    }

    $(".WikiaArticle a[title]").hover(function () {
        if (this.className != "") { return; } // 作为 wikilink 的超链接没有 class
        var a = $(this);
        var title = a.attr("title");
        if (title != a.text()) {
            a.append($('<span class="wikilink-popup">' + htmlEncode(title) + '</span>'));
        }
    }, function () {
        $(this).find(".wikilink-popup").remove();
    });
})();

/**
* 自动转换链接
* @author [[User:UnownHearn]]
* @version 1.5 (2019/03/20)
*/
(function () { /* 自动链接 */
    var filter = (function (node) {
        if (node.nodeType == 3 /* TEXT_NODE */) {
            return NodeFilter.FILTER_ACCEPT;
        } else if (node.nodeType != 1 /* ELEMENT_NODE */
            || node.tagName.toLowerCase() == "a"
            || node.classList.contains("no-autolink")) {
            return NodeFilter.FILTER_REJECT;
        }
        return NodeFilter.FILTER_SKIP;

    })

    var rules = [{
        // 两字母 + 一串数字
        regex: /[a-zA-Z]{2}\d+/g,
        link: function (text) {
            var base;
            switch (text.slice(0, 2)) {
                // niconico 主要
                case "sm": case "nm": base = "https://www.nicovideo.jp/watch/"; break;
                case "im": base = "https://seiga.nicovideo.jp/seiga/"; break;
                // bilibili
                case "av": base = "https://www.bilibili.com/video/"; break;
                case "cv": /*专栏*/ base = "https://www.bilibili.com/read/"; break;
                case "am": /*音频*/ base = "https://www.bilibili.com/audio/"; break;
                // acfun
                case "ac": base = "http://www.acfun.cn/v/"; break;
                // niconico 其他, 参考: https://dic.nicovideo.jp/a/nico.ms
                case "sg": case "mg": case "bk": /*静画*/ base = "https://seiga.nicovideo.jp/watch/"; break;
                case "lv": /*生放送*/ base = "https://live.nicovideo.jp/watch/"; break;
                /* l/co 略去 */
                case "co": /*社区*/ base = "https://com.nicovideo.jp/community/"; break;
                case "ch": /*频道*/ base = "https://ch.nicovideo.jp/channel/"; break;
                case "ar": /*频道文章*/ base = "https://ch.nicovideo.jp/article/"; break;
                case "nd": /*直贩*/ base = "https://chokuhan.nicovideo.jp/products/detail/"; break;
                /* 市场略去 */
                case "ap": /*应用*/ base = "https://app.nicovideo.jp/app/"; break;
                case "jk": /*实况*/ base = "https://jk.nicovideo.jp/watch/"; break;
                case "nc": /*共有*/ base = "https://www.niconicommons.jp/material/"; break;
                case "nw": /*新闻*/ base = "https://news.nicovideo.jp/watch/"; break;
            }
            if (base !== undefined) { return base + text; }
            return false;
        }
    }, {
        // niconico mylist/ 及 user/
        regex: /(mylist|user)\/\d+/g,
        link: "https://www.nicovideo.jp/{}"
    }];

    var nodes = [];

    var as = document.getElementsByClassName("WikiaArticle");
    Array.prototype.forEach.call(as, function (a) {
        var walker = document.createTreeWalker(a, NodeFilter.SHOW_ALL, { acceptNode: filter });
        while (walker.nextNode()) {
            nodes.push(walker.currentNode);
        }
    })

    for (var nodeIndex in nodes) {
        var node = nodes[nodeIndex];
        var html = node.textContent;

        for (var ruleIndex in rules) {
            var rule = rules[ruleIndex];
            html = html.replace(rule.regex, function (text) {
                var link;
                if (typeof rule.link === "function") {
                    link = rule.link(text);
                    if (link === false) { //< 如果返回 false, 代表并并未匹配到链接, 保留原文
                        return text;
                    }
                } else {
                    link = rule.link.replace("{}", text);
                }
                return "<a class=\"autolink\" href=\"" + link + "\">" +
                    text + "</a>";
            });
        }

        if (html != node.textContent) {
            var parentNode = node.parentNode;
            var dummy = document.createElement("span");
            dummy.innerHTML = html;
            parentNode.replaceChild(dummy, node);
        }
    }
})();