User:Gqqnb/js/category item description.js

维基百科,自由的百科全书

注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google ChromeFirefoxMicrosoft EdgeSafari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。

// ==UserScript==
// @id             
// @name           显示分类项描述
// @version        1.0
// @namespace      
// @author         Gqqnbig
// @description    本脚本可以用在维基自定义JS中,也可以当成油猴子脚本使用
// @include        http://*.wikipedia.org/*
// @include        https://*.wikipedia.org/*
// @run-at         window-load
// @require        http://code.jquery.com/jquery-1.7.1.min.js
// @delay 1000
// ==/UserScript==

/*
 * 本JS在分类页面上工作,
 * 将该分类下的条目加上一句话的描述,该描述取自条目正文第一段第一句。
 * 描述长度已限制为32个字,外用small标签包裹(字体会显得小一点)。
 *
 * 如果您喜欢,希望可以在讨论页里按赞,谢谢。
 */

(function () {
if (typeof (unsafeWindow) != 'undefined') {
    var $ = unsafeWindow.jQuery;
    var wgNamespaceNumber = unsafeWindow.wgNamespaceNumber;
    var wgScriptPath = unsafeWindow.wgScriptPath;
}
/// <reference path="Scripts/jquery-1.7.1.intellisense.js" />

//console.log(isCategory);

if (wgNamespaceNumber != 14) { //14是分类。http://www.mediawiki.org/wiki/Manual:Namespace
    //console.log("停止运行");
    document.execCommand("stop");
    return 'This is not an error. This is just to abort javascript';
}


$(".mw-content-ltr ul li a").each(function () {
    var $node = $(this);
    var pageName = $node.attr("href");
    pageName = pageName.substring(pageName.indexOf("/wiki/") + 6, pageName.length);
    //console.log(pageName);
    getArticleDescription(pageName, $node);
});
}() );

function getArticleDescription(pageName, $node) {
    $.ajax({
        url: wgScriptPath + "/api.php?action=query&prop=extracts&exintro&format=json&converttitles&titles=" + pageName,
        //async: false,
        success: function (data) {
            //console.log(pageName);

            //if (data.query.converted) {
            //    console.log(data.query.converted);
            //}
            //console.log(data);

            for (key in data.query.pages) {
                //console.log(key);
                data = data.query.pages[key];
                break;
            }
            //console.log(data);
            //console.log(data.title);
            pageName = data.title;//输入的pageName可能是简体,但实际上页面名可能是繁体,需要url上converttitles来转换。

            var content = data.extract;

            //console.log(content);

            //取第一段...
            var i = content.indexOf("<p>"); //正常段落的p标签是没有 class="xxx"之类的属性的。
            var j = content.indexOf("</p>", i);
            if (i == -1 || j == -1) {
                var e = "条目" + pageName + "的正文里没有段落";

                return;
                console.log(e + ":" + content);
                throw new Error(e);
            }
            //if (i > j)
            //    throw new Error("条目" + pageName + "的正文p标签不正常");

            var firstParagraph = "<span>" + content.substring(i + 3, j) + "</span>";
            //console.log(firstParagraph);
            var $firstParagraph = $($.parseHTML(firstParagraph));


            removeName($firstParagraph);

            //...的第一句。
            var description = $firstParagraph.text();
            i = description.indexOf("。");
            //console.log(i);
            if (i > -1) {
                description = description.substring(0, i);
                //console.log(description);
            }

            //去除括号。
            description = description.replace(/[\((].*?[\))]/g, '');

            if (description[0] == ",")
                description = description.substring(1, description.length);

            description = limitDescriptionLength(description, 32);

            if (description.length > 0) {
                $node.parent().append(":");
                $node.parent().append($("<small>" + description + "</small>"));
            }
        }
    });
    return;

    $.getJSON("http://zh.wikipedia.org/w/api.php?action=parse&page=" + pageName + "&format=json&section=0&prop=text", function (data) {
        console.log(pageName);
        var content = data.parse.text["*"];

        //取第一段...
        var i = content.indexOf("<p>"); //正常段落的p标签是没有 class="xxx"之类的属性的。
        var j = content.indexOf("</p>", i);
        if (i == -1 || j == -1) {
            var e = "条目" + pageName + "的正文里没有段落";
            console.log(e + ":" + content);
            throw new Error(e);
        }
        //if (i > j)
        //    throw new Error("条目" + pageName + "的正文p标签不正常");

        var firstParagraph = "<span>" + content.substring(i + 3, j) + "</span>";
        console.log(firstParagraph);
        var $firstParagraph = $($.parseHTML(firstParagraph));


        removeName($firstParagraph);

        //...的第一句。
        var description = $firstParagraph.text();
        i = description.indexOf("。");
        //console.log(i);
        if (i > -1) {
            description = description.substring(0, i);
            //console.log(description);
        }

        //去除括号。
        description = description.replace(/[\((].*?[\))]/g, '');

        if (description[0] == ",")
            description = description.substring(1, description.length);

        description = limitDescriptionLength(description, 32);

        if (description.length > 0) {
            $node.parent().append(":");
            $node.parent().append($("<small>" + description + "</small>"));
        }


        //alert(data.length);
    });
    //document.execCommand("stop");
}

function removeName($paragraph) {
    //console.log($paragraph);
    var node = $paragraph.contents()[0];
    //console.log(node.nodeType);
    if (node.nodeType == 1) //ELEMENT_NODE
    {
        var $pageName = $(node);
        if ($pageName.prop("tagName") == "B")
            $pageName.detach();
    }
    else if (node.nodeType == 3) {
        //console.log(node.data);
        if (node.data == "《") {
            $(node).detach();
            removeName($paragraph);
            node = $paragraph.contents()[0];
            if (node.nodeType == 3 && node.data[0] == '》') {
                node.data = node.data.substring(1, node.data.length);
                //console.log(node);
            }

        }
    }
}

function limitDescriptionLength(description, length) {
    if (description.length > length)
        return description.substring(0, length) + "…";
    else
        return description;
}

//[[分类:维基脚本]] 复制後请删除此列避免分类