MediaWiki:Common.js
Giao diện
![]() | Đây là JavaScript ảnh hưởng đến toàn bộ người dùng. Các thay đổi lớn ở đây nên được đề xuất trước hết trong trang thảo luận hoặc Phòng thảo luận.
Xin lưu ý rằng những thay đổi ở đây sẽ có hiệu lực sau vài phút. Những lỗi vô tình ở đây có thể phá hỏng toàn bộ bách khoa toàn thư, vì vậy hãy đảm bảo rằng bạn biết chắc mình đang làm gì. Có thể thử nghiệm trước trong trang common.js hay một trang skin JS tùy chọn khác của cá nhân bạn. |
Chú ý: Sau khi lưu thay đổi trang, bạn phải xóa bộ nhớ đệm của trình duyệt để nhìn thấy các thay đổi. Google Chrome, Firefox, Internet Explorer và Safari: Giữ phím ⇧ Shift và nhấn nút Reload/Tải lại trên thanh công cụ của trình duyệt. Để biết chi tiết và hướng dẫn cho các trình duyệt khác, xem Trợ giúp:Xóa bộ nhớ đệm.
mw.loader.using( ['mediawiki.util', 'mediawiki.notify', 'jquery.client'], function () {
/* Đầu hàm gọi lại mw.loader.using() */
/* Kết các đoạn mã lưu bên ngoài */
if ( mw.config.get( 'wgAction' ) === 'edit' || mw.config.get( 'wgAction' ) === 'submit' || mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Upload' ) {
// Mã chỉ dành riêng cho trang sửa đổi
importScript("MediaWiki:Common.js/edit.js");
} else if ( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Watchlist' ) {
// Mã chỉ dành riêng cho danh sách theo dõi
importScript( 'MediaWiki:Common.js/watchlist.js' );
}
/**
* Sửa bố cục Trang Chính
*
* Miêu tả: Thêm một liên kết bổ sung đến danh sách đầy đủ các phiên bản ngôn ngữ hiện có.
* Bảo trì: [[:en:User:AzaToth]], [[:en:User:R. Koot]], [[:en:User:Alex Smotrov]]
*/
if ( mw.config.get( 'wgPageName' ) === 'Trang_Chính' || mw.config.get( 'wgPageName' ) === 'Thảo_luận:Trang_Chính' ) {
$( function () {
mw.util.addPortletLink( 'p-lang', '//meta.wikimedia.org/w/index.php?title=List_of_Wikipedias&uselang=vi',
'Danh sách đầy đủ', 'interwiki-completelist', 'Danh sách đầy đủ các phiên bản Wikipedia' );
} );
}
/**
* Đổi hướng User:Name/skin.js và skin.css sang trang skin hiện tại
* @source mediawiki.org/wiki/Snippets/Redirect_skin.js
* @rev 3
*/
if ( mw.config.get( 'wgArticleId' ) === 0 && mw.config.get( 'wgNamespaceNumber' ) === 2 ) {
var titleParts = mw.config.get( 'wgPageName' ).split( '/' );
// Make sure there was a part before and after the slash
// And that the latter is 'skin.js' or 'skin.css'
if ( titleParts.length == 2 ) {
var userSkinPage = titleParts[0] + '/' + mw.config.get( 'skin' );
if ( titleParts[1] === 'skin.js' ) {
window.location.href = mw.util.getUrl( userSkinPage + '.js' );
} else if ( titleParts[1] === 'skin.css' ) {
window.location.href = mw.util.getUrl( userSkinPage + '.css' );
}
}
}
/**
* addPortletLink sang mw.util
*
* @deprecated: Hãy dùng mw.util.addPortletLink thay thế.
*/
mw.log.deprecate( window, 'addPortletLink', mw.util.addPortletLink, 'Hãy dùng mw.util.addPortletLink thay thế' );
/**
* Trích xuất thông số URL từ URL hiện tại
*
* @deprecated: Hãy dùng mw.util.getParamValue và thoát ký tự đàng hoàng
*/
mw.log.deprecate( window, 'getURLParamValue', mw.util.getParamValue, 'Hãy dùng mw.util.getParamValue thay thế' );
/**
* Kiểm tra một phân tử HTML có lớp nào đó hay không
*
* @deprecated: Hãy dùng $(element).hasClass() thay thế.
*/
mw.log.deprecate( window, 'hasClass', function ( element, className ) {
return $( element ).hasClass( className );
}, 'Hãy dùng jQuery.hasClass() thay thế' );
/**
* @source www.mediawiki.org/wiki/Snippets/Load_JS_and_CSS_by_URL
* @rev 6
*/
var extraCSS = mw.util.getParamValue( 'withCSS' ),
extraJS = mw.util.getParamValue( 'withJS' );
if ( extraCSS ) {
if ( extraCSS.match( /^MediaWiki:[^&<>=%#]*\.css$/ ) ) {
mw.loader.load( '/w/index.php?title=' + extraCSS + '&action=raw&ctype=text/css', 'text/css' );
} else {
mw.notify( 'Chỉ cho phép các trang từ không gian tên MediaWiki.', { title: 'Giá trị withCSS không hợp lệ' } );
}
}
if ( extraJS ) {
if ( extraJS.match( /^MediaWiki:[^&<>=%#]*\.js$/ ) ) {
mw.loader.load( '/w/index.php?title=' + extraJS + '&action=raw&ctype=text/javascript' );
} else {
mw.notify( 'Chỉ cho phép các trang từ không gian tên MediaWiki.', { title: 'Giá trị withJS không hợp lệ' } );
}
}
/* Tải kịch bản dành cho Internet Explorer */
if ( $.client.profile().name === 'msie' ) {
importScript( 'MediaWiki:Common.js/IEFixes.js' );
}
/* Sửa kết xuất phông chữ Unicode trên Windows XP */
if ( navigator.appVersion.search(/windows nt 5/i) !== -1 ) {
mw.util.addCSS( '.IPA { font-family: "Lucida Sans Unicode", "Arial Unicode MS"; } ' +
'.Unicode { font-family: "Arial Unicode MS", "Lucida Sans Unicode"; } ' );
}
/** Liên kết interwiki đến các bài chọn lọc ***************************************
*
* Chức năng: Chuyển dấu chấm trước các liên kết liên wiki của các bài chọn lọc
* thành dấu sao
* Người bảo trì: [[:en:User:R. Koot]]
*/
function LinkFA() {
if ( document.getElementById( "p-lang" ) ) {
var InterwikiLinks = document.getElementById( "p-lang" ).getElementsByTagName( "li" );
for ( var i = 0; i < InterwikiLinks.length; i++ ) {
var className = InterwikiLinks[i].className.match(/interwiki-[-\w]+/);
if ( document.getElementById( className + "-fa" ) && InterwikiLinks[i].className.indexOf( "badge-featuredarticle" ) === -1 ) {
InterwikiLinks[i].className += " FA";
InterwikiLinks[i].title = "Liên kết này dẫn đến bài chọn lọc.";
} else if ( document.getElementById( className + "-ga" ) && InterwikiLinks[i].className.indexOf( "badge-goodarticle" ) === -1 ) {
InterwikiLinks[i].className += " GA";
InterwikiLinks[i].title = "Liên kết này dẫn đến bài chất lượng tốt.";
}
}
}
}
mw.hook("wikipage.content").add(LinkFA);
/**
* Biểu tượng trên cùng góc phải.
*
* @source: //www.mediawiki.org/wiki/Snippets/Top_icons
* @rev: 2
*/
mw.hook("wikipage.content").add(function () {
$( '.right-uppermost' ).prependTo( '#firstHeading' ).show();
});
/**
* Bảng có thể thu gọn; được thực hiện với mw-collapsible
* Kiểu dáng cũng được đặt ra để tránh FOUC
*
* Cho phép các bảng được thu gọn, chỉ hiển thị tiêu đề. Xem [[en:Help:Collapsing]].
* @version 3.0.0 (2018-05-20)
* @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-collapsibleTables.js
* @author [[en:User:R. Koot]]
* @author [[en:User:Krinkle]]
* @author [[en:User:TheDJ]]
* @deprecated Từ MediaWiki 1.20: Dùng class="mw-collapsible" thay vào đó
* được hỗ trợ trong lõi MediaWiki. Có thể bắt đầu từ MediaWiki 1.32
*/
function makeCollapsibleMwCollapsible( $content ) {
var $tables = $content
.find( 'table.collapsible:not(.mw-collapsible)' )
.addClass( 'mw-collapsible' );
$.each( $tables, function( index, table ) {
// mw.log.warn( 'This page is using the deprecated class collapsible. Please replace it with mw-collapsible.');
if( $( table ).hasClass( 'collapsed') ) {
$( table ).addClass( 'mw-collapsed' );
// mw.log.warn( 'This page is using the deprecated class collapsed. Please replace it with mw-collapsed.');
}
} );
if( $tables.length > 0 ) {
mw.loader.using( 'jquery.makeCollapsible' ).then( function() {
$tables.makeCollapsible();
} );
}
}
mw.hook( 'wikipage.content' ).add( makeCollapsibleMwCollapsible );
/**
* Thêm hỗ trợ cho mw-collapsible cho autocollapse, innercollapse và outercollapse
*
* Bảo trì: TheDJ
*/
function mwCollapsibleSetup( $collapsibleContent ) {
var $element,
$toggle,
autoCollapseThreshold = 2;
$.each( $collapsibleContent, function (index, element) {
$element = $( element );
if ( $element.hasClass( 'collapsible' ) ) {
$element.find('tr:first > th:first').prepend( $element.find('tr:first > * > .mw-collapsible-toggle'));
}
if ( $collapsibleContent.length >= autoCollapseThreshold && $element.hasClass( 'autocollapse' ) ) {
$element.data( 'mw-collapsible' ).collapse();
} else if ( $element.hasClass( 'innercollapse' ) ) {
if ( $element.parents( '.outercollapse' ).length > 0 ) {
$element.data( 'mw-collapsible' ).collapse();
}
}
// because of colored backgrounds, style the link in the text color
// to ensure accessible contrast
$toggle = $element.find( '.mw-collapsible-toggle' );
if ( $toggle.length ) {
// Make the toggle inherit text color
if( $toggle.parent()[0].style.color ) {
$toggle.find( 'a' ).css( 'color', 'inherit' );
}
}
} );
}
mw.hook( 'wikipage.collapsibleContent' ).add( mwCollapsibleSetup );
/**
* Thanh điều hướng động (thử nghiệm)
*
* Miêu tả: Xem [[Wikipedia:NavFrame]].
* Bảo trì: KHÔNG GIỚI HẠN
*/
var collapseCaption = 'ẩn';
var expandCaption = 'hiện';
// thiết lập từ trong ngôn ngữ của chúng ta
var navigationBarHide = '[' + collapseCaption + ']';
var navigationBarShow = '[' + expandCaption + ']';
/**
* Hiển thị và ẩn nội dung và hình ảnh (nếu có) của các thanh điều hướng.
*
* @param {number} indexNavigationBar Chỉ mục của thanh điều hướng được bật
* @param {jQuery.Event} sự kiện đối tượng Sự kiện
*/
function toggleNavigationBar( indexNavigationBar, event ) {
var navToggle = document.getElementById( 'NavToggle' + indexNavigationBar );
var navFrame = document.getElementById( 'NavFrame' + indexNavigationBar );
var navChild;
if ( !navFrame || !navToggle ) {
return false;
}
// If shown now
if ( navToggle.firstChild.data === navigationBarHide ) {
for ( navChild = navFrame.firstChild; navChild !== null; navChild = navChild.nextSibling ) {
if ( $( navChild ).hasClass( 'NavContent' ) ) {
navChild.style.display = 'none';
}
}
navToggle.firstChild.data = navigationBarShow;
// If hidden now
} else if ( navToggle.firstChild.data === navigationBarShow ) {
for ( navChild = navFrame.firstChild; navChild !== null; navChild = navChild.nextSibling ) {
if ( $( navChild ).hasClass( 'NavContent' ) ) {
navChild.style.display = 'block';
}
}
navToggle.firstChild.data = navigationBarHide;
}
event.preventDefault();
}
/**
* Thêm nút hiển/ẩn vào thanh điều hướng.
*
* @param {jQuery} $content
*/
function createNavigationBarToggleButton( $content ) {
var i, j, navChild, navToggle, navToggleText, isCollapsed,
indexNavigationBar = 0;
// Iterate over all < div >-elements
var $divs = $content.find( 'div.NavFrame:not(.mw-collapsible)' );
$divs.each( function ( i, navFrame ) {
indexNavigationBar++;
navToggle = document.createElement( 'a' );
navToggle.className = 'NavToggle';
navToggle.setAttribute( 'id', 'NavToggle' + indexNavigationBar );
navToggle.setAttribute( 'href', '#' );
$( navToggle ).on( 'click', $.proxy( toggleNavigationBar, null, indexNavigationBar ) );
isCollapsed = $( navFrame ).hasClass( 'collapsed' );
/**
* Kiểm tra nếu có mục con đã được ẩn. Vòng lặp này ở đây để tương thích ngược:
* cách cũ để khiến NavFrames bắt đầu mở rộng là thêm thủ công style="display:none"
* cho tất cả các yếu tố NavPic/NavContent. Vì điều này là xấu cho khả năng tiếp cận (không có cách nào để thực hiện
* nội dung hiển thị mà không cần hỗ trợ JavaScript), cách mới được đề xuất là thêm lớp
* "collapsed" với chính NavFrame, giống như với các bảng có thể thu gọn.
*/
for ( navChild = navFrame.firstChild; navChild !== null && !isCollapsed; navChild = navChild.nextSibling ) {
if ( $( navChild ).hasClass( 'NavPic' ) || $( navChild ).hasClass( 'NavContent' ) ) {
if ( navChild.style.display === 'none' ) {
isCollapsed = true;
}
}
}
if ( isCollapsed ) {
for ( navChild = navFrame.firstChild; navChild !== null; navChild = navChild.nextSibling ) {
if ( $( navChild ).hasClass( 'NavPic' ) || $( navChild ).hasClass( 'NavContent' ) ) {
navChild.style.display = 'none';
}
}
}
navToggleText = document.createTextNode( isCollapsed ? navigationBarShow : navigationBarHide );
navToggle.appendChild( navToggleText );
// Tìm NavHead và đính kèm liên kết chuyển đổi (Phải phức tạp vì việc xử lý đầu tiên của Moz bị cấm)
for ( j = 0; j < navFrame.childNodes.length; j++ ) {
if ( $( navFrame.childNodes[j] ).hasClass( 'NavHead' ) ) {
navToggle.style.color = navFrame.childNodes[j].style.color;
navFrame.childNodes[j].appendChild( navToggle );
}
}
navFrame.setAttribute( 'id', 'NavFrame' + indexNavigationBar );
} );
}
mw.hook( 'wikipage.content' ).add( createNavigationBarToggleButton );
/** Viết lại tựa bài và bỏ dòng "Hạn chế kỹ thuật" khi hiển thị một số tựa bài ***************************************
Hàm dước bản mẫu {{tựa sai}} sử dụng
Hàm này tìm
<div id="RealTitleBanner">
<span id="RealTitle">titre</span>
</div>
Nếu có thành phần id="DisableRealTitle" thì tắt hàm
*/
function rewritePageH1() {
var realTitleBanner = document.getElementById('RealTitleBanner');
if (realTitleBanner && mw.config.get("wgNamespaceNumber") === 0) {
if (!document.getElementById('DisableRealTitle')) {
var realTitle = document.getElementById('RealTitle');
var h1 = document.getElementsByTagName('h1')[0];
if (realTitle && h1) {
var titleText = realTitle.innerHTML;
if (titleText === '') h1.style.display = 'none';
else {
h1.innerHTML = titleText;
document.title = document.title.replace(mw.config.get("wgPageName").replace(/_/g, " "),
realTitle.textContent);
}
realTitleBanner.style.display = 'none';
}
}
}
}
mw.hook("wikipage.content").add(rewritePageH1);
/**
* Gắn bảng giới thiệu vào đầu [[Trợ giúp:Chỗ thử]].
*/
mw.hook("wikipage.content").add(function () {
if (mw.config.get("wgPageName") != "Trợ_giúp:Chỗ_thử" ||
mw.config.get("wgAction") != "view" || $("#sandbox-intro").length) {
return;
}
var purgeLink = mw.html.element("a", {
href: mw.util.getUrl("Trợ_giúp:Chỗ_thử", {
action: "edit",
oldid: "15257082",
summary: "Tẩy trống chỗ thử",
minor: "yes"
})
}, "xóa định kỳ");
var editText = mw.html.element("b", {
"style": "white-space: nowrap;"
}, $("#ca-ve-edit").text());
var intro = $(mw.html.element("div", {
"class": "plainlinks toccolours",
id: "sandbox-intro"
}, new mw.html.Raw("Đây là trang bạn có thể thử thoải mái cách soạn bài " +
"trong Wikipedia. Nội dung ở đây sẽ bị " + purgeLink +
". Để bắt đầu sửa đổi trang này, hãy nhấn chuột vào thẻ " +
editText + " ở trên.")));
$("#mw-content-text").wrapInner("<div class='sandbox'></div>").prepend(intro);
});
/**
* Chọn chế độ sửa đổi theo cookie khi bấm liên kết đỏ.
*/
mw.hook("wikipage.content").add(function () {
if (mw.cookie.get("VEE", "") === "wikitext") {
$(".noarticletext, .searchresults h2").find("a").each(function (idx, elt) {
var uri = new mw.Uri(elt.href);
if ("veaction" in uri.query) {
uri.query.action = uri.query.veaction;
elt.href = uri.toString();
}
});
}
});
/**
* WikiMiniAtlas
*
* Miêu tả: WikiMiniAtlas là một cửa sổ bật lên và kéo bản đồ thế giới.
* Kịch bản này khiến tất cả các liên kết tọa độ của chúng tôi hiển thị nút bật lên WikiMiniAtlas.
* Bản thân đoạn mã nằm trên meta vì nó được sử dụng bởi nhiều dự án.
* Xem [[Meta:WikiMiniAtlas]] để biết thêm thông tin.
* Chú ý - nên sử dụng dịch vụ này để thay thế bằng mw:Help:Extension:Kartographer
*/
$( function () {
var require_wikiminiatlas = $( 'a.external.text[href*="geohack"]' ).length || $( 'div.kmldata' ).length;
if ( require_wikiminiatlas ) {
mw.loader.load( '//meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js&action=raw&ctype=text/javascript' );
}
} );
/* Cố định liên kết "Tải tập tin lên"
*/
mw.hook("wikipage.content").add(function() {
$("#t-upload a").attr("href", mw.util.getUrl("Wikipedia:Tải tập tin lên"));
});
/**
* Thông báo sửa đổi ma thuật ****************************************************
*
* Mô tả: Thêm thông báo sửa đổi cho trang định hướng và TSNDS.
* Maintainers: [[User:RockMFR]]
*/
function addEditIntro( name ) {
$( '.mw-editsection, #ca-edit, #ca-ve-edit' ).find( 'a' ).each( function ( i, el ) {
el.href = $( this ).attr( 'href' ) + '&editintro=' + name;
} );
}
if ( mw.config.get( 'wgNamespaceNumber' ) === 0 ) {
$( function () {
if ( document.getElementById( 'disambigbox' ) ) {
addEditIntro( 'Bản_mẫu:Disambig_editintro' );
}
} );
$( function () {
var cats = mw.config.get('wgCategories');
if ( !cats ) {
return;
}
if ( $.inArray( 'Nhân vật còn sống', cats ) !== -1 || $.inArray( 'Nhân vật có thể còn sống', cats ) !== -1 ) {
addEditIntro( 'Bản_mẫu:BLP_editintro' );
}
} );
}
/**
* Cho phép hiện/ẩn phần tử tùy công cụ Biên dịch nội dung được kích hoạt.
*/
mw.hook("wikipage.content").add(function () {
if (parseInt(mw.user.options.get("cx")) === 1) {
$(document.documentElement).addClass("cx-available");
}
});
// Kết quả từ Wikidata
// [[:Tập tin:Wdsearch script screenshot.png]]
if ( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Search' || ( mw.config.get( 'wgArticleId' ) === 0 && mw.config.get( 'wgCanonicalSpecialPageName' ) === false ) ) {
importScriptURI("//en.wikipedia.org/w/index.php?title=MediaWiki:Wdsearch.js&action=raw&ctype=text/javascript");
}
/* Kết hàm gọi lại mw.loader.using() */
} );
/* ĐỪNG THÊM MÃ DƯỚI DÒNG NÀY */