MediaWiki:Common.js:修订间差异

来自失传媒体中文维基
跳转到导航 跳转到搜索
HW
HW留言 | 贡献
IDOMOY
IDOMOY留言 | 贡献 (已还原IDOMOY讨论)的编辑至最后由HW修订的版本)
 
(未显示2个用户的31个中间版本)
第5行: 第5行:
             $elements.each( function () {
             $elements.each( function () {
                 var $link = $( this );
                 var $link = $( this );
                 if ( $link.prev( '.sp-avatar-wrapper' ).length ) {
                 if ( $link.prev( '.sp-avatar-wrapper' ).length || $link.data('avatar-added') ) {
                    return;
        return;
                }
    }
    $link.data('avatar-added', true);
const excludeContainers = [
const excludeContainers = [
第75行: 第76行:
                                 $styleTag = $( '<style id="dynamic-avatar-style"></style>' ).appendTo( 'head' );
                                 $styleTag = $( '<style id="dynamic-avatar-style"></style>' ).appendTo( 'head' );
                             }
                             }
                             var css = '.minerva-icon--userAvatarOutline { background-image: url("' + avatarUrl + '"); background-repeat: no-repeat; background-size: contain; width: 30px; height: 30px; mask-image: unset; }';
                             var css = '.mw-header .citizen-dropdown-summary[title="打开/关闭个人菜单"] .citizen-ui-icon.mw-ui-icon-wikimedia-userAvatar { background-image: url("' + avatarUrl + '"); background-repeat: no-repeat; background-size: contain; width: 30px; height: 30px; }  .mw-header .citizen-dropdown-summary[title="打开/关闭个人菜单"] .citizen-ui-icon.mw-ui-icon-wikimedia-userAvatar::before{mask-image: unset;background-color: transparent;}';
                             $styleTag.text( css );
                             $styleTag.text( css );
                         }
                         }
第95行: 第96行:




//DPL4翻页跳转
(function() {
    var container = document.getElementById('dpl-jump-area');
    if (container) {
        var count = parseInt(container.getAttribute('data-count'));
        var total = parseInt(container.getAttribute('data-total'));
        var offset = parseInt(container.getAttribute('data-offset'));
        var pageName = container.getAttribute('data-pagename');
        var maxPage = Math.ceil(total / count);
        var currentPage = Math.floor(offset / count) + 1;


//重定向
        var input = document.createElement('input');
/*
        input.type = 'number';
(function() {
        input.value = currentPage;
    const url = new URL(window.location.href);
        input.min = 1;
    const pathname = url.pathname;
        input.max = maxPage;
    const searchParams = url.searchParams;
        input.style.width = '45px';
   
        input.style.margin = '0 5px';
    const isIndexPhp = pathname === '/index.php';
 
    const hasOnlyTitleParam = searchParams.size === 1 && searchParams.has('title');
        var button = document.createElement('button');
    const titleValue = searchParams.get('title') || '';
        button.innerText = '确认';
    const hasValidTitle = titleValue.trim() !== '';
        button.onclick = function() {
            var pageNum = parseInt(input.value);
            if (pageNum >= 1 && pageNum <= maxPage) {
                var targetOffset = (pageNum - 1) * count;
                window.location.href = mw.util.getUrl(pageName) + '?DPL_offset=' + targetOffset;
            } else {
                alert('请输入 1 到 ' + maxPage + ' 之间的页码');
            }
        };


    if (isIndexPhp && hasOnlyTitleParam && hasValidTitle) {
        container.innerHTML = ' 跳至第 ';
         const targetUrl = `/wiki/${encodeURIComponent(titleValue)}`;
        container.appendChild(input);
         window.location.replace(targetUrl);
         container.appendChild(document.createTextNode(' 页 '));
         container.appendChild(button);
     }
     }
})();
})();
*/


//折叠
document.addEventListener('DOMContentLoaded', () => {
  // 找到页面上所有 .lm-collapsible
  document.querySelectorAll('.lm-collapsible').forEach(collapsible => {
    const toggle = collapsible.querySelector('.lm-toggle');
    const content = collapsible.querySelector('.lm-content');
    const icon = collapsible.querySelector('.lm-icon');


     if (!toggle || !content) return;
// Wikidot 迁站提示
(function () {
    'use strict';
 
     if (mw.config.get('wgAction') !== 'edit') return;
 
    const pageTitle = mw.config.get('wgTitle');
 
    // json
    fetch(mw.util.wikiScript('index') + '?title=MediaWiki:Wikidot-map.json&action=raw')
        .then(response => {
            if (!response.ok) throw new Error('JSON加载失败');
            return response.json();
        })
        .then(data => {
            const match = data.find(item => item.title === pageTitle);
 
            if (match && match.url) {
                const html = `
                    <div class="styled-quote">
                        <p>迁站前该页面原Wikidot页面:
                            <a href="https://lostmedia.wikidot.com/${match.url}" target="_blank" rel="noopener">
                                ${match.title}
                            </a>
                        </p>
                        <p>站内工具:<a href="https://lostmediawiki.cn/wiki/%E7%89%B9%E6%AE%8A:%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6" target="_blank" rel="noopener">上传文件</a> ; <a href="https://lostmediawiki.cn/wiki/特殊:BatchUpload" target="_blank" rel="noopener">批量上传</a> ; <a href="https://lostmediawiki.cn/index.php?title=%E7%89%B9%E6%AE%8A:%E6%90%9C%E7%B4%A2&search=%E6%96%87%E4%BB%B6%3A${match.title}" target="_blank" rel="noopener">搜索文件${match.title}</a> ;
                        </p>
<iframe src="https://code.hw233.vip/tool/Mediawiki/copy.html"></iframe>
                    </div>`;
 
                const content = document.getElementById('mw-content-text');
                if (content) {
                    content.insertAdjacentHTML('afterbegin', html);
                }
            }
        })
        .catch(error => {
            console.warn('Wikidot迁站提示加载失败:', error);
        });
})();


    // 点击切换
    toggle.addEventListener('click', () => {
      const isOpen = collapsible.classList.toggle('lm-open');


      // 切换 + / -
      icon.textContent = isOpen ? '−' : '+';


      // 可选:平滑展开/收起
      if (isOpen) {
        content.style.maxHeight = content.scrollHeight + 'px';
      } else {
        content.style.maxHeight = '0px';
      }
    });


    // 初始化为关闭状态
//外部链接新窗口打开
    collapsible.classList.remove('lm-open');
(function() {
    if (content) content.style.maxHeight = '0px';
     const siteDomain = 'lostmediawiki.cn';
  });
});
// ==================== 折叠图片框 增强 JS ====================
mw.hook('wikipage.content').add(function($content) {
     // 自动修复图片折叠(确保 figure 完全隐藏)
    $content.find('.image-collapsible.mw-collapsed').each(function() {
        var $this = $(this);
        $this.find('figure, img').hide(); // 额外保险
    });


     // 可选:点击标题栏也能折叠(更像原生 App)
     function fixLink(link) {
    $content.find('.image-collapsible .mw-collapsible-always-show').on('click', function(e) {
        if (!link.href) return;
        if (!$(e.target).is('a')) {
        const href = link.href.toLowerCase();
             $(this).closest('.mw-collapsible').find('.mw-collapsible-toggle a').trigger('click');
        if (href.startsWith('mailto:') || href.startsWith('tel:') || href.startsWith('javascript:')) return;
         }
       
        try {
            const url = new URL(link.href);
            if (!url.hostname.includes(siteDomain)) {
                link.target = '_blank';
                link.rel = 'noopener noreferrer';
            }
        } catch (e) {}
    }
    window.addEventListener('load', function() {
        document.querySelectorAll('a[href]').forEach(fixLink);
        const observer = new MutationObserver(function(mutations) {
             mutations.forEach(function(mutation) {
                mutation.addedNodes.forEach(function(node) {
                    if (node.nodeType === 1) {
                        if (node.tagName === 'A') fixLink(node);
                        node.querySelectorAll('a[href]').forEach(fixLink);
                    }
                });
            });
        });
         observer.observe(document.body, { childList: true, subtree: true });
     });
     });
});
})();

2026年5月16日 (六) 15:51的最新版本

//用户名前显示头像
mw.loader.using( 'mediawiki.util', function () {
    $( document ).ready( function () {
        function addAvatarsToElements( $elements ) {
            $elements.each( function () {
                var $link = $( this );
                if ( $link.prev( '.sp-avatar-wrapper' ).length || $link.data('avatar-added') ) {
        			return;
    			}
    			$link.data('avatar-added', true);
				
				const excludeContainers = [
					'#p-views', 
					'#p-cactions', 
					'#p-tb', 
					'#right-navigation', 
					'#p-personal', 
					'.mw-portlet-personal'
				];
					// 检查是否匹配任意一个排除容器
				const isExcluded = excludeContainers.some(selector => $link.closest(selector).length);
				if (isExcluded) {
					return;
				}

                var href = $link.attr( 'href' );
                if ( !href ) return;
                var userPart = decodeURIComponent( href.split( '/wiki/' )[1] );
                if ( !userPart ) return;
                if ( userPart.indexOf( '/' ) !== -1 ) {
                    return;
                }
                var userName = userPart.replace( /^User:|^用户:/, '' ).replace(/_/g, ' ');
                var linkText = $link.text().trim().replace(/^User:|^用户:/, '');
                if ( linkText !== userName ) {
                    var $target = $link.find( 'span, bdi' ).first();
                    var targetText = $target.length ? $target.text().trim().replace(/^User:|^用户:/, '') : '';
                    if ( !$target.length || targetText !== userName ) {
                        return;
                    }
                }
                new mw.Api().get( {
                    action: 'parse',
                    text: '{{#avatar:' + userName + '|l}}',
                    contentmodel: 'wikitext',
                    disablelimitreport: true,
                    disableeditsection: true
                } ).done( function ( data ) {
                    if ( data.parse && data.parse.text ) {
                        var avatarHtml = data.parse.text[ '*' ];
                        var $avatarWrapper = $( '<span class="sp-avatar-wrapper" style="vertical-align: middle; margin-right: 4px; display: inline-block;"></span>' ).html( avatarHtml );
                        $avatarWrapper.find( 'img' ).css( {
						    width: '1.5em',
						    height: '1.5em',
						    objectFit: 'cover',
						    display: 'inline-block',
						    verticalAlign: 'middle',
						    border: 'var(--background-color-neutral, #eaecf0) 2px solid',
						    boxSizing: 'border-box'
						} );
                        $link.before( $avatarWrapper );

                        if ( mw.user.isAnon() ) {
                            return;
                        }
                        var currentUserName = mw.user.getName();
                        if ( userName !== currentUserName ) {
                            return;
                        }

                        var avatarImg = $avatarWrapper.find( 'img' );
                        var avatarUrl = avatarImg.attr( 'src' );
                        if ( avatarUrl && avatarUrl !== '/images/avatars/default_l.gif' ) {
                            var $styleTag = $( '#dynamic-avatar-style' );
                            if ( !$styleTag.length ) {
                                $styleTag = $( '<style id="dynamic-avatar-style"></style>' ).appendTo( 'head' );
                            }
                            var css = '.mw-header .citizen-dropdown-summary[title="打开/关闭个人菜单"] .citizen-ui-icon.mw-ui-icon-wikimedia-userAvatar { background-image: url("' + avatarUrl + '"); background-repeat: no-repeat; background-size: contain; width: 30px; height: 30px; }   .mw-header .citizen-dropdown-summary[title="打开/关闭个人菜单"] .citizen-ui-icon.mw-ui-icon-wikimedia-userAvatar::before{mask-image: unset;background-color: transparent;}';
                            $styleTag.text( css );
                        }
                    }
                } );
            } );
        }
        addAvatarsToElements( $( 'a[href*="/wiki/User:"], a[href*="/wiki/%E7%94%A8%E6%88%B7:"], a[href*="/wiki/用户:"]' ) );
        var observer = new MutationObserver( function ( mutations ) {
            mutations.forEach( function ( mutation ) {
                $( mutation.addedNodes ).find( 'a[href*="/wiki/User:"], a[href*="/wiki/%E7%94%A8%E6%88%B7:"], a[href*="/wiki/用户:"]' ).each( function() {
                    addAvatarsToElements( $( this ) );
                } );
            } );
        } );
        observer.observe( document.body, { childList: true, subtree: true } );
    } );
} );


//DPL4翻页跳转
(function() {
    var container = document.getElementById('dpl-jump-area');
    if (container) {
        var count = parseInt(container.getAttribute('data-count'));
        var total = parseInt(container.getAttribute('data-total'));
        var offset = parseInt(container.getAttribute('data-offset'));
        var pageName = container.getAttribute('data-pagename');
        var maxPage = Math.ceil(total / count);
        var currentPage = Math.floor(offset / count) + 1;

        var input = document.createElement('input');
        input.type = 'number';
        input.value = currentPage;
        input.min = 1;
        input.max = maxPage;
        input.style.width = '45px';
        input.style.margin = '0 5px';

        var button = document.createElement('button');
        button.innerText = '确认';
        button.onclick = function() {
            var pageNum = parseInt(input.value);
            if (pageNum >= 1 && pageNum <= maxPage) {
                var targetOffset = (pageNum - 1) * count;
                window.location.href = mw.util.getUrl(pageName) + '?DPL_offset=' + targetOffset;
            } else {
                alert('请输入 1 到 ' + maxPage + ' 之间的页码');
            }
        };

        container.innerHTML = ' 跳至第 ';
        container.appendChild(input);
        container.appendChild(document.createTextNode(' 页 '));
        container.appendChild(button);
    }
})();


// Wikidot 迁站提示
(function () {
    'use strict';

    if (mw.config.get('wgAction') !== 'edit') return;

    const pageTitle = mw.config.get('wgTitle');

    // json
    fetch(mw.util.wikiScript('index') + '?title=MediaWiki:Wikidot-map.json&action=raw')
        .then(response => {
            if (!response.ok) throw new Error('JSON加载失败');
            return response.json();
        })
        .then(data => {
            const match = data.find(item => item.title === pageTitle);

            if (match && match.url) {
                const html = `
                    <div class="styled-quote">
                        <p>迁站前该页面原Wikidot页面:
                            <a href="https://lostmedia.wikidot.com/${match.url}" target="_blank" rel="noopener">
                                ${match.title}
                            </a>
                        </p>
                        <p>站内工具:<a href="https://lostmediawiki.cn/wiki/%E7%89%B9%E6%AE%8A:%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6" target="_blank" rel="noopener">上传文件</a> ; <a href="https://lostmediawiki.cn/wiki/特殊:BatchUpload" target="_blank" rel="noopener">批量上传</a> ; <a href="https://lostmediawiki.cn/index.php?title=%E7%89%B9%E6%AE%8A:%E6%90%9C%E7%B4%A2&search=%E6%96%87%E4%BB%B6%3A${match.title}" target="_blank" rel="noopener">搜索文件${match.title}</a> ; 
                        </p>
<iframe src="https://code.hw233.vip/tool/Mediawiki/copy.html"></iframe>
                    </div>`;

                const content = document.getElementById('mw-content-text');
                if (content) {
                    content.insertAdjacentHTML('afterbegin', html);
                }
            }
        })
        .catch(error => {
            console.warn('Wikidot迁站提示加载失败:', error);
        });
})();




//外部链接新窗口打开
(function() {
    const siteDomain = 'lostmediawiki.cn';

    function fixLink(link) {
        if (!link.href) return;
        const href = link.href.toLowerCase();
        if (href.startsWith('mailto:') || href.startsWith('tel:') || href.startsWith('javascript:')) return;
        
        try {
            const url = new URL(link.href);
            if (!url.hostname.includes(siteDomain)) {
                link.target = '_blank';
                link.rel = 'noopener noreferrer';
            }
        } catch (e) {}
    }
    window.addEventListener('load', function() {
        document.querySelectorAll('a[href]').forEach(fixLink);
        const observer = new MutationObserver(function(mutations) {
            mutations.forEach(function(mutation) {
                mutation.addedNodes.forEach(function(node) {
                    if (node.nodeType === 1) {
                        if (node.tagName === 'A') fixLink(node);
                        node.querySelectorAll('a[href]').forEach(fixLink);
                    }
                });
            });
        });
        observer.observe(document.body, { childList: true, subtree: true });
    });
})();