ميدياويكي:Gadget-Shortdesc-helper.js

من كوبتيكبيديا
اذهب إلى التنقلاذهب الى البحث
لم تعد النسخة القابلة للطباعة مدعومة وقد تحتوي على أخطاء في العرض. يرجى تحديث علامات متصفحك المرجعية واستخدام وظيفة الطباعة الافتراضية في متصفحك بدلا منها.

ملاحظة: بعد النشر، أنت قد تحتاج إلى إفراغ الكاش الخاص بمتصفحك لرؤية التغييرات.

  • فايرفوكس / سافاري: أمسك Shift أثناء ضغط Reload، أو اضغط على إما Ctrl-F5 أو Ctrl-R (⌘-R على ماك)
  • جوجل كروم: اضغط Ctrl-Shift-R (⌘-Shift-R على ماك)
  • إنترنت إكسبلورر/إيدج: أمسك Ctrl أثناء ضغط Refresh، أو اضغط Ctrl-F5
  • أوبرا: اضغط Ctrl-F5.
//[[zh:MediaWiki:Gadget-WikidataDesc.js]]
/**
 * WikidataDesc
 *
 * 在条目顶端显示/编辑维基数据描述
 *
 * 原作者:User:Alexander Misel ([[Special:Permalink/45559457]])
 * 改进  :User:逆襲的天邪鬼
 */

mw.loader.using('mediawiki.ForeignApi').done(function () {
    'use strict';

    var UI = {
        SAVING: 'يحفظ...',
        EDIT: 'عدل',
        SAVE: 'احفظ',
        CANCEL: 'ألغ',
        PLACEHOLDER: 'اكتب وصفا موجزا لموضوع المقالة',
        EMPTY: 'لا وصف من ويكيديتا',
        SUCCESS: 'تمام',
        ERROR: 'خطأ',
    };

    var $desc = $('<div id="wikidatadesc" style="font-size:90%" class="noprint">');
    var $saving = $('<span id="wikidatadesc_loading" class="text option" style="display:none;">(' + UI.SAVING + ')</span>');
    var $text = $('<span id="wikidatadesc_text" class="text">');
    var $editlink = $('<a href="#" class="option">[' + UI.EDIT + ']</a>');
    var $descbox = $('<div id="wikidatadesc_descbox">')
                        .append($text)
                        .append('&nbsp;')
                        .append($saving)
                        .append($editlink);
    var $input = $('<input class="editbox" type="text" placeHolder="' + UI.PLACEHOLDER + '">');
    var $save = $('<a href="#" class="option" id="wikidatadesc_save">[' + UI.SAVE + ']</a>');
    var $cancel = $('<a href="#" class="option" id="wikidatadesc_cancel">[' + UI.CANCEL + ']</a>');
    var $editbox = $('<div id="wikidatadesc_editbox" style="display:none;">')
                        .append($input)
                        .append('<br>')
                        .append($save)
                        .append($cancel);
    var CSS = '#wikidatadesc .text { color: gray; } #wikidatadesc .editbox { width: 100%; padding: 4px; border: none; border-bottom: 1px solid #ccc; box-sizing: border-box; } #wikidatadesc .editbox:focus { border-bottom: 1px solid #0645ad; } #wikidatadesc .option { font-size: inherit; }';

    var status = 0;         // 0 显示,1 编辑
    var loaded = false;
    var saving = false;
    var id = '';
    var label = '';
    var lastdesc = '';
    var pagename = mw.config.get('wgPageName');

    var loadCtl = function () {
        $('body').append($('<style>').text(CSS));
        $desc.append($descbox).append($editbox);
        $("#siteSub").hide().before($desc);

        $editlink.click(function () {
            if (status !== 0 || saving) {
                return;
            }
            status = 1;

            $descbox.hide();
            $editbox.show();
            $input.focus();
        });

        $save.click(function () {
            if (status !== 1) {
                return;
            }
            status = 0;
            saving = true;

            var newdesc = $input.val();

            $text.text(newdesc);
            $saving.show();
            $editlink.hide();
            $descbox.show();
            $editbox.hide();

            save(newdesc, function (success, error) {
                saving = false;
                $saving.hide();
                $editlink.show();
                if (success) {
                    lastdesc = newdesc;
                    mw.notify(UI.SUCCESS);
                } else {
                    $text.text(lastdesc);
                    mw.notify(UI.ERROR);
                }
            });
        });

        $cancel.click(function () {
            if (status !== 1) {
                return;
            }
            status = 0;
            $input.val(lastdesc);
            $descbox.show();
            $editbox.hide();
        });

        $input.keydown(function (e) {
            if (e.which === 13) {
                $save.click();
            } else if (e.which === 27) {
                $cancel.click();
            }
        });

        loaded = true;
    };

    var show = function (desc) {
        if (!loaded) {
            loadCtl();
        }

        if (desc !== null) {
            $text.text(desc);
            $input.val(desc);
            lastdesc = desc;
        } else {
            $text.text('(' + UI.EMPTY + ')');
            $input.val('');
            lastdesc = '';
        }
    };

    var load = function (callback) {
        var ns = mw.config.get('wgNamespaceNumber');
        if (ns === 0) {
            var api = new mw.ForeignApi('https://www.wikidata.org/w/api.php');
            var res = '';
            api.get( {
                action: 'wbgetentities',
                props:  'labels|descriptions',
                sites:  'arwiki',
                titles: pagename,
                languages: 'ar'
            }).done(function(data){
                $.each( data.entities, function( i, item ) {
                    if (i == '-1') {
                        id = 'NE';
                        callback(null);
                    } else {
                        id = item.id;
                        var labels = item.labels;
                        if (labels.ar) {
                            label = labels.ar.value;
                        } else {
                            label = '';
                        }

                        var desc = item.descriptions;
                        if (desc.ar) {
                            res = desc.ar.value;
                            callback(res);
                        } else {
                            callback(null);
                        }
                    }
                });
            });
        }
    };

    var save = function (newdesc, callback) {
        var api = new mw.ForeignApi('https://www.wikidata.org/w/api.php');

        api.get( {
            action: 'query',
            meta:   'tokens'
        }).done(function (data) {
            if (id == 'NE') {
                var jdata = '{"labels":{"ar":{"language":"ar","value":"'
                            + pagename + '"}}, "descriptions":{"ar":{"language":"ar","value":"'
                            + newdesc + '"}}, "sitelinks":{"arwiki":{"site":"arwiki","title":"'
                            + pagename + '"}}}';
                api.post({
                    action: 'wbeditentity',
                    'new':    'item',
                    token:  data.query.tokens.csrftoken,
                    data:   jdata
                }).done(function () {
                    callback(true);
                }).fail(function () {
                    callback(false);
                });
            } else {
                api.post({
                    action: 'wbsetdescription',
                    id: id,
                    token: data.query.tokens.csrftoken,
                    language: 'ar',
                    value: newdesc,
                }).done(function () {
                    if (label === '') {
                        api.post({
                            action: 'wbsetlabel',
                            id: id,
                            token: data.query.tokens.csrftoken,
                            language: 'ar',
                            value: pagename,
                        }).always(function () {
                            callback(true);
                        });
                    } else {
                        callback(true);
                    }
                }).fail(function () {
                    callback(false);
                });
            }
        }).fail(function () {
            callback(false);
        });
    };

    load(show);
});