MediaWiki:Gadget-NopInserter.js
Cache: Sau khi lưu biểu mẫu này, phải xóa bộ nhớ đệm (cache) của trình duyệt để những thay đổi hiện ra:
Firefox, Chrome, Safari, Opera — Shift Internet Explorer — Ctrl Konqueror —
Nếu bạn viết mã JavaScript, chú ý đọc hướng dẫn để tránh mâu thuẫn với mã mặc định của mạng.
// Chèn NOP (kết thúc đoạn văn) vào trang Trang: ở phía trước.
// Nhập từ en.wikisource
// User:Inductiveload
// Release 1.0 - 2012-04-23 - initial release
// 1.1 - 2012-04-25 - add user option to auto advance
//
// Để tự đọng chuyển tới trang đã sửa sau khi thêm {{nop}},
// thêm đoạn mã sau vào JS cá nhân:
//
// Tự động chuyển tới trang trước đó sau khi kiểm tra nop
// mw.user.options.set({'nopinserter_auto_advance':true});
NopInserter = function() {
var myself=this;
var match = /(.*?)\/([0-9]+)/.exec(mw.config.get( 'wgPageName' ));
if (match === null ){ return }
var basename = match[1];
var pagenum = parseInt(match[2]);
if (pagenum < 1 ){ return }
this.prev_page = basename + '/' + (pagenum - 1);
var portletLink = mw.util.addPortletLink(
'p-tb', '#', 'Trang trước {{nop}}', 't-check-prev-page-nop', 'Kiểm tra xem trang trước có kết thúc bằng dòng mới rồi {{nop}} không.'
);
$( portletLink ).click( function ( e ) {
e.preventDefault();
myself.get_raw_page(myself.prev_page, myself.check_nop);
});
};
NopInserter.prototype.get_page_parts = function(data) {
//split up the page into header, body and footer
var match = /<noinclude>([\s\S]*)<\/noinclude>([\s\S]*?)<noinclude>([\s\S]*)<\/noinclude>/m.exec(data);
return match;
};
NopInserter.prototype.assemble_page_parts = function(parts) {
//re-assemble a page from the header, body and footer
return '<noinclude>'+parts[1]+'</noinclude>'+parts[2]+'<noinclude>' + parts[3] +'</noinclude>';
};
NopInserter.prototype.check_nop = function(parts) {
var match = /\n{{[Nn]op}}\s*$/.exec(parts[2]);
var prefs = mw.config.get('userjs-nopinserter') || {};
if (match!==null) {
alert('Tìm thấy {{nop}} ở cuối trang trước.');
this.go_to_page();
} else {
if (prefs.dontConfirmNopAddition === true) {
this.add_trailing_nop(parts); // Don't prompt if explicitly requested not to.
} else {
if (confirm('Không tìm thấy {{nop}} ở cuối trang trước. Thêm?')) {
this.add_trailing_nop(parts);
}
}
}
};
NopInserter.prototype.add_trailing_nop = function(parts) {
//remove trailing space and add the nop
parts[2] = parts[2].replace(/\s*$/i,'') + '\n{{nop}}';
var new_text = this.assemble_page_parts(parts);
this.save_page(this.prev_page, new_text, 'Thêm {{nop}} để kết thúc đoạn văn vào cuối trang phía trước');
};
NopInserter.prototype.get_raw_page = function(pagetitle, callback) {
var myself = this,
api = new mw.Api();
//get the current page text
api.get( {
action: 'parse',
page: pagetitle,
prop: 'wikitext'
} ).done( function ( data ) {
var parts = myself.get_page_parts(data.parse.wikitext['*']);
$.proxy(callback, myself)(parts);
} ).fail( function () {
alert('Không tải được trang trước: [[' + pagetitle + ']]');
} );
};
NopInserter.prototype.save_page = function(title, content, summary) {
var myself = this;
var prefs = mw.config.get('userjs-nopinserter') || {};
var highlightCSS = "";
var resetCSS = "";
var resetTimeout = prefs.notificationTimeout ? prefs.notificationTimeout : 2000;
if (prefs.notificationStyle === "highlight") {
highlightCSS = {'background-color': 'palegreen'};
resetCSS = {'background-color': ''};
} else {
highlightCSS = {'outline': '2px solid green'};
resetCSS = {'outline': ''};
}
$.ajax({
url: mw.util.wikiScript( 'api' ),
data: {
format: 'json',
action: 'edit',
title: title,
summary: summary,
text: content,
token: mw.user.tokens.get( 'csrfToken' )
},
dataType: 'json',
type: 'POST',
success: function( data ) {
if ( data && data.edit && data.edit.result == 'Success' ) {
if (prefs.notificationStyle === "none") {
// No notification at all.
}
else if (prefs.notificationStyle === "message") {
mw.notify(
"Đã thêm {{nop}} vào trang phía trước.",
{title: 'thêm {{nop}}', type: 'info', tag: 'NopInserterNopAdded'}
);
}
else { // Defaults to "highlight".
$('#ca-proofreadPagePrevLink').children().css(highlightCSS);
setTimeout(function() {
$('#ca-proofreadPagePrevLink').children().css(resetCSS);
}, resetTimeout);
}
myself.go_to_page();
} else if ( data && data.error ) {
alert( 'Lỗi: API trả về mã lỗi "' + data.error.code + '": ' + data.error.info );
} else {
alert( 'Lỗi: Kết quả không rõ từ API.' );
}
},
error: function( xhr ) {
$.alert( 'Lỗi: Yêu cầu thất bại.' );
}
});
};
NopInserter.prototype.go_to_page = function() {
//go to the previous page if the user's options specify to do so
if ( mw.user.options.exists( 'nopinserter_auto_advance' ) && mw.user.options.get('nopinserter_auto_advance') ) {
window.location = mw.config.get('wgArticlePath').replace('$1', this.prev_page);
}
};
$(document).ready( function() {
//Page namespace only
if( mw.config.get( 'wgNamespaceNumber' ) == 104 ) {
var NopInserterInstance = new NopInserter(96);
}
});