Thành viên:CDzWik/common.js
Giao diệ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.
/** * Giữ mã nguồn ở MediaWiki:Common.js một cách tối thiểu vì nó sẽ được tải * vô điều kiện cho mọi thành viên ở tất cả các trang wiki. Nếu có thể hãy tạo * công cụ (gadget) và để nó kích hoạt mặc định thay vì đặt ở đây (vì công cụ * là các mô đun ResourceLoader tối ưu hóa tối đa với khả năng ghi các phần phụ * thuộc). * * Vì Common.js không phải là công cụ, không có chỗ để khai báo phần phụ thuộc * cho nó, do đó ta phải tải chậm với mw.loader.using khi cần và thực hiện toàn * bộ trong lần gọi lại lần nữa. Trong phần lớn trường hợp các phần phụ thuộc * này sẽ được tải trước khi tải mã ở đây. *//* global mw, $, OO *//* jshint strict:false, browser:true */// Per migration docs, declare all necessary dependencies.mw.loader.using(['mediawiki.util', 'mediawiki.cookie', 'jquery.makeCollapsible']).done(() => { const conf = mw.config.get([ 'wgPageName', 'wgArticleId', 'wgNamespaceNumber', 'wgCanonicalSpecialPageName', 'wgAction', 'wgCategories', 'wgUserGroups', 'skin' ]); /** * Sửa bố cục Trang Chính */ if (conf.wgPageName === 'Trang_Chính' || conf.wgPageName === 'Thảo_luận:Trang_Chính') { 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 đến các trang giao diện hiện tại */ if (conf.wgArticleId === 0 && conf.wgNamespaceNumber === 2) { const titleParts = conf.wgPageName.split('/'); if (titleParts.length === 2) { const skinSubpage = titleParts[1].toLowerCase(); if (skinSubpage === 'skin.js' || skinSubpage === 'skin.css') { const newTarget = `${titleParts[0]}/${conf.skin}.${skinSubpage.split('.')[1]}`; window.location.href = mw.util.getUrl(newTarget); } } } /** * Tải CSS/JS bổ sung qua tham số URL */ const extraCSS = mw.util.getParamValue('withCSS'); const extraJS = mw.util.getParamValue('withJS'); if (extraCSS && /^MediaWiki:[^&<>=%#]*\.css$/.test(extraCSS)) { mw.loader.load(`/w/index.php?title=${extraCSS}&action=raw&ctype=text/css`, 'text/css'); } else if (extraCSS) { 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 && /^MediaWiki:[^&<>=%#]*\.js$/.test(extraJS)) { mw.loader.load(`/w/index.php?title=${extraJS}&action=raw&ctype=text/javascript`); } else if (extraJS) { 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ệ' }); } /** * WikiMiniAtlas */ if ($('a.external.text[href*="geohack"], div.kmldata').length) { mw.loader.load('//meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js&action=raw&ctype=text/javascript'); } /** * Bảng có thể thu gọn (Tương thích ngược) */ function makeCollapsibleMwCollapsible($content) { const $tables = $content .find('table.collapsible:not(.mw-collapsible)') .addClass('mw-collapsible'); $tables.filter('.collapsed').addClass('mw-collapsed'); if ($tables.length) { $tables.makeCollapsible(); } } /** * Hỗ trợ autocollapse, inner/outercollapse cho mw-collapsible */ function mwCollapsibleSetup($collapsibleContent) { const autoCollapseThreshold = 2; const $autocollapseItems = $collapsibleContent.filter('.autocollapse'); if ($autocollapseItems.length >= autoCollapseThreshold) { $autocollapseItems.each((i, el) => $(el).data('mw-collapsible').collapse()); } $collapsibleContent.filter('.innercollapse').each((i, el) => { const $element = $(el); if ($element.closest('.outercollapse').length) { $element.data('mw-collapsible').collapse(); } }); $collapsibleContent.find('.mw-collapsible-toggle').each((i, toggle) => { const $toggle = $(toggle); const parentColor = $toggle.parent().css('color'); if (parentColor) { $toggle.find('a').css('color', 'inherit'); } }); } /** * Thanh điều hướng động (NavFrames) - Đã được hiện đại hóa */ function createNavigationBarToggleButton($content) { const collapseCaption = 'ẩn'; const expandCaption = 'hiện'; $content.find('div.NavFrame:not(.mw-collapsible)').each((index, navFrame) => { const $navFrame = $(navFrame).attr('id', `NavFrame${index}`); const $navHead = $navFrame.find('.NavHead').first(); if (!$navHead.length) return; let isCollapsed = $navFrame.hasClass('collapsed') || $navFrame.find('.NavContent, .NavPic').first().is(':hidden'); const $toggleLink = $('<a>', { class: 'NavToggle', id: `NavToggle${index}`, href: '#', text: `[${isCollapsed ? expandCaption : collapseCaption}]` }).css('color', $navHead.css('color')); const $contentToToggle = $navFrame.find('.NavContent, .NavPic'); if (isCollapsed) $contentToToggle.hide(); $toggleLink.on('click', (e) => { e.preventDefault(); const wasCollapsed = $navFrame.hasClass('is-collapsed'); $contentToToggle.toggle(!wasCollapsed); $toggleLink.text(`[${wasCollapsed ? collapseCaption : expandCaption}]`); $navFrame.toggleClass('is-collapsed', !wasCollapsed); }); if (isCollapsed) $navFrame.addClass('is-collapsed'); $navHead.append($toggleLink); }); } /** * Thông báo sửa đổi (Edit Intros) */ function addEditIntro(name) { $('.mw-editsection a, #ca-edit a, #ca-ve-edit a').each((i, el) => { el.href += `&editintro=${name}`; }); } if (conf.wgNamespaceNumber === 0) { if ($('#disambigbox').length) addEditIntro('Bản_mẫu:Disambig_editintro'); // FIX: Replaced optional chaining (?.) with a standard `&&` check for compatibility. if (conf.wgCategories && conf.wgCategories.some(cat => cat === 'Nhân vật còn sống' || cat === 'Nhân vật có thể còn sống')) { addEditIntro('Bản_mẫu:BLP_editintro'); } } /* Các hành động cụ thể cho trang sửa đổi */ if (conf.wgAction === 'edit' || conf.wgAction === 'submit') { if (window.location.search.includes('undo=') && $('input[name="wpAutoSummary"]').length) { $('input[name="wpAutoSummary"]').val('1'); } } /* =================================================================================== */ /* MÃ DÀNH RIÊNG CHO WIKIPEDIA TIẾNG VIỆT */ /* =================================================================================== */ const scriptPath = (page) => `/w/index.php?title=MediaWiki:Common.js/${page}&action=raw&ctype=text/javascript`; if (conf.wgAction === 'edit' || conf.wgAction === 'submit' || conf.wgCanonicalSpecialPageName === 'Upload') { mw.loader.load(scriptPath('edit.js')); } else if (conf.wgCanonicalSpecialPageName === 'Watchlist') { mw.loader.load(scriptPath('watchlist.js')); } if (navigator.userAgent.includes('Windows NT 5')) { mw.util.addCSS('.IPA { font-family: "Lucida Sans Unicode", "Arial Unicode MS"; }.Unicode { font-family: "Arial Unicode MS", "Lucida Sans Unicode"; }'); } function LinkFA() { $('#p-lang li[class*="interwiki-"]').each((i, item) => { const $item = $(item); const langClass = ($item.attr('class').match(/interwiki-([-\w]+)/) || [])[0]; if (!langClass) return; if ($(`#${langClass}-fa`).length && !$item.hasClass('badge-featuredarticle')) { $item.addClass('FA').attr('title', 'Liên kết này dẫn đến bài chọn lọc.'); } else if ($(`#${langClass}-ga`).length && !$item.hasClass('badge-goodarticle')) { $item.addClass('GA').attr('title', 'Liên kết này dẫn đến bài chất lượng tốt.'); } }); } function setupSandbox() { if (conf.wgPageName === 'Trợ_giúp:Chỗ_thử' && conf.wgAction === 'view') { const intro = mw.html.element('div', {id: 'sbox'}, '{{Các thông báo sửa đổi/Trang/Trợ giúp:Chỗ thử}}'); $('#mw-content-text').wrapInner('<div class="sandbox"></div>').prepend(intro); } } /** Chọn chế độ sửa đổi theo cookie. Migrated from mw.Uri to native URL API */ function setRedLinkEditor() { if (mw.cookie.get('VEE') === 'wikitext') { $('.noarticletext a, .searchresults h2 a').each((i, el) => { try { const url = new URL(el.href); if (url.searchParams.has('veaction')) { url.searchParams.set('action', 'edit'); url.searchParams.delete('veaction'); el.href = url.toString(); } } catch (e) { // Ignore invalid URLs } }); } } function setupContentTranslationVisibility() { if (mw.user.options.get('cx') === '1') { document.documentElement.classList.add('cx-available'); } } function fixUploadLink() { $('#t-upload a').attr('href', mw.util.getUrl('Wikipedia:Trình tải lên tập tin')); } function loadWdSearch() { if (conf.wgCanonicalSpecialPageName === 'Search' || (conf.wgArticleId === 0 && !conf.wgCanonicalSpecialPageName)) { mw.loader.load('//en.wikipedia.org/w/index.php?title=MediaWiki:Wdsearch.js&action=raw&ctype=text/javascript'); } } function hideContentTranslation() { const allowedGroups = ['sysop', 'eliminator', 'extendedconfirmed']; // FIX: Replaced optional chaining (?.) with a standard `&&` check for compatibility. const hasAccess = conf.wgUserGroups && conf.wgUserGroups.some(group => allowedGroups.includes(group)); if (!hasAccess) { mw.util.addCSS('#cx-language, .cx-campaign-translations, .cx-contributions-translation { display: none; }'); if (conf.wgCanonicalSpecialPageName === 'ContentTranslation') { mw.loader.using('oojs-ui').then(() => { OO.ui.alert('Không thể sử dụng công cụ này vì bạn không phải là Thành viên được xác nhận mở rộng.') .done(() => { window.location.href = mw.util.getUrl('Wikipedia:Biên dịch'); }); }); } } } // === HOOKS === mw.hook('wikipage.content').add(($content) => { makeCollapsibleMwCollapsible($content); createNavigationBarToggleButton($content); LinkFA(); setupSandbox(); setRedLinkEditor(); setupContentTranslationVisibility(); fixUploadLink(); hideContentTranslation(); }); mw.hook('wikipage.collapsibleContent').add(mwCollapsibleSetup); loadWdSearch();});// Legacy `window.hookEvent` is obsolete and removed./* KHÔNG THÊM MÃ DƯỚI DÒNG NÀY */