“MediaWiki:Common.js”的版本间的差异

来自科学ADV中文wiki
跳到导航 跳到搜索
(创建页面,内容为“// richtab $(document).ready(function () { $(".richtab > li > span > a").click(function(e) { e.preventDefault(); var richtab = $(this).closest(".richtab");…”)
 
 
(未显示3个用户的30个中间版本)
第1行: 第1行:
 
// richtab
 
// richtab
$(document).ready(function () {
+
 
 +
function richTabSetup( $content ) {
 
$(".richtab > li > span > a").click(function(e) {
 
$(".richtab > li > span > a").click(function(e) {
 
    e.preventDefault();
 
    e.preventDefault();
第12行: 第13行:
 
    var richtab_active_content = richtab_contents.children()[richtab_index];
 
    var richtab_active_content = richtab_contents.children()[richtab_index];
 
    $(richtab_active_content).addClass('active');
 
    $(richtab_active_content).addClass('active');
})
+
});
});
+
}
 +
mw.hook( 'wikipage.content' ).add( richTabSetup );
 +
 
 +
// 折叠支持
 +
 
 +
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 );
 +
 
 +
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 );
 +
 
 +
// 外链音乐-网易云音乐
 +
 
 +
function outChainMusic163Setup( $content ) {
 +
var $players = $content
 +
.find( '.outchainmusic-163' );
 +
 +
$.each( $players, function ( index, player ) {
 +
var id = player.dataset.id;
 +
        var type = player.dataset.type;
 +
        if (!/^\d+$/.test(id)) return self.css('color', 'red').text('Error in outchain music data: Invalid id.');
 +
        if (!/^\d+$/.test(type)) return self.css('color', 'red').text('Error in outchain music data: Invalid type.');
 +
var source1 = '<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=330 height=86 src="//music.163.com/outchain/player?auto=0&height=66&';
 +
var source2 = 'type=' + type + '&id=' + id;
 +
var source3 = '"></iframe>';
 +
var source = source1 + source2 + source3;
 +
$(player).empty().append(source);
 +
});
 +
}
 +
 
 +
mw.hook( 'wikipage.content' ).add( outChainMusic163Setup );
 +
 
 +
// 页面锚路径切换
 +
function hashSwitchSetup ($content) {
 +
var $hashSwitches = $content.find('#hash-switch-directory');
 +
if ($hashSwitches.length === 0)
 +
return;
 +
if ($hashSwitches.length > 1) {
 +
$.each( $hashSwitches, function ( index, $directory ) {
 +
$($directory).empty().append('multiple directory found');
 +
});
 +
return;
 +
}
 +
var $directory = ($hashSwitches[0].dataset.hash || '').split(';').map(function (s) { return s.split(','); });
 +
if (!$directory.length)
 +
return;
 +
function index_from_hash($directory, hash, $default) {
 +
var $hash = hash.substr(1);
 +
for (var i = 0; i < $directory.length; i++) {
 +
var $item = $directory[i];
 +
for (var j = 0; j < $item.length; j++) {
 +
if ($item[j] === $hash) {
 +
return i;
 +
}
 +
}
 +
}
 +
return $default;
 +
}
 +
function hash_from_index($directory, index) {
 +
return ($directory[index] || [])[0] || '';
 +
}
 +
function refresh_hash_switch_state($directory, choice) {
 +
var hash_active_class = 'hash-active';
 +
$.each($(document).find('.hash-switch'), function(index, item) {
 +
var $item = $(item);
 +
if ($item.hasClass(choice)) {
 +
$item.addClass(hash_active_class);
 +
} else {
 +
$item.removeClass(hash_active_class);
 +
}
 +
});
 +
}
 +
var curhash = window.location.hash || '';
 +
var hash_class_prefix = 'hash-value-';
 +
var initial_choice = index_from_hash($directory, curhash, 0);
 +
var initial_choice_hash_class = hash_class_prefix + hash_from_index($directory, initial_choice);
 +
refresh_hash_switch_state($directory, initial_choice_hash_class);
 +
window.addEventListener("hashchange", function() {
 +
var newhash = window.location.hash || '';
 +
var new_choice = index_from_hash($directory, newhash, -1);
 +
if (new_choice === -1)
 +
return;
 +
var new_choice_hash_class = hash_class_prefix + hash_from_index($directory, new_choice);
 +
refresh_hash_switch_state($directory, new_choice_hash_class);
 +
}, false);
 +
window.hashSwitchDirectory = $directory;
 +
}
 +
 
 +
mw.hook( 'wikipage.content').add( hashSwitchSetup );
 +
 
 +
// 外链设置
 +
 
 +
function externalLinkSetup($content) {
 +
var $externalLinks = $content.find('.target-blank-fix');
 +
$.each( $externalLinks, function ( index, $externalLinkContainer ) {
 +
$.each( $($externalLinkContainer).find('a'), function ( index, $externalLink) {
 +
$externalLink.target = 'blank';
 +
$externalLink.rel = 'nofollow noref';
 +
});
 +
});
 +
}
 +
 
 +
mw.hook( 'wikipage.content').add( externalLinkSetup );
 +
 
 +
// 让表格横向滚动超出部分
 +
function tableWrapper($content) {
 +
var $tables = $content.find('table');
 +
$tables.each(function( index, element ) {
 +
if ( $(element).hasClass( 'w-100' ) ) {
 +
$(element).wrap('<div class="overflow-box"></div>');
 +
}
 +
});
 +
}
 +
 
 +
mw.hook( 'wikipage.content').add( tableWrapper );
 +
 
 +
 
 +
$(function() {
 +
// 通用外链样式优化
 +
    $.each($('.exlink'), function (index, item) {
 +
        if ($(item).attr('title')) {
 +
            $('<img src="' + $(item).attr('title') + '" width="16px">').prependTo($(item))
 +
            $(item).removeAttr('title')
 +
        }
 +
        else {
 +
        item = $(item).children('a')
 +
            var url = $(item).attr('href')
 +
            const domain = url.match(
 +
                /^(http(s)?:\/\/)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/
 +
            )[0]
 +
            var icon = domain + '/favicon.ico'
 +
            $(item).before('<img src="' + icon + '" width="16px" onerror="this.src=\'http://www.google.cn/s2/favicons?domain=' + url + '\'">')
 +
        }
 +
        /*var ico = new Image()
 +
        ico.src = icon
 +
        function iconCheck(ico) {
 +
          return new Promise((resolve, reject) => {
 +
            ico.onload = () => resolve()
 +
            ico.onerror = () => reject()
 +
          })
 +
        }
 +
        await iconCheck(ico)
 +
          .then(() => {
 +
            $(item).before('<img src="' + icon + '" width="16px">')
 +
          })
 +
          .catch(() => {
 +
            $(item).before(
 +
              '<img src="http://www.google.cn/s2/favicons?domain=' + url + '" width="16px">'
 +
            )
 +
          })*/
 +
    })
 +
   
 +
    // 水平目录样式优化
 +
    $.each($('.horizontal-toc .toctitle + ul'), function (index, item) {
 +
        $('<li><a href="#top"><span class="toctext">返回顶部</span></a></li>').prependTo(item)
 +
    })
 +
    $.each($('.horizontal-toc h2'), function (index, item) {
 +
        $(item).append(':')
 +
    })
 +
   
 +
    // 复数目录
 +
    $.each($('.multi-toc'), function (index, item) {
 +
        $(item).append($('#toc').clone())
 +
    })
 +
})

2021年12月11日 (六) 22:03的最新版本

// richtab

function richTabSetup( $content ) {
	$(".richtab > li > span > a").click(function(e) {
	    e.preventDefault();
		var richtab = $(this).closest(".richtab");
		var richtab_current = $(this).closest(".richtab > li");
		richtab.children().removeClass('active');
		richtab_current.addClass('active');
		var richtab_contents = richtab.next('.richtab-content');
		richtab_contents.children().removeClass('active');
		var richtab_index = richtab_current.prevAll().length;
	    var richtab_active_content = richtab_contents.children()[richtab_index];
	    $(richtab_active_content).addClass('active');
	});
}
mw.hook( 'wikipage.content' ).add( richTabSetup );

// 折叠支持

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 );

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 );

// 外链音乐-网易云音乐

function outChainMusic163Setup( $content ) {
	var $players = $content
		.find( '.outchainmusic-163' );
	
	$.each( $players, function ( index, player ) {
		var id = player.dataset.id;
        var type = player.dataset.type;
        if (!/^\d+$/.test(id)) return self.css('color', 'red').text('Error in outchain music data: Invalid id.');
        if (!/^\d+$/.test(type)) return self.css('color', 'red').text('Error in outchain music data: Invalid type.');
		var source1 = '<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=330 height=86 src="//music.163.com/outchain/player?auto=0&height=66&';
		var source2 = 'type=' + type + '&id=' + id;
		var source3 = '"></iframe>';
		var source = source1 + source2 + source3;
		$(player).empty().append(source);
	});
}

mw.hook( 'wikipage.content' ).add( outChainMusic163Setup );

// 页面锚路径切换
function hashSwitchSetup ($content) {
	var $hashSwitches = $content.find('#hash-switch-directory');
	if ($hashSwitches.length === 0)
		return;
	if ($hashSwitches.length > 1) {
		$.each( $hashSwitches, function ( index, $directory ) {
			$($directory).empty().append('multiple directory found');
		});
		return;
	}
	var $directory = ($hashSwitches[0].dataset.hash || '').split(';').map(function (s) { return s.split(','); });
	if (!$directory.length)
		return;
	function index_from_hash($directory, hash, $default) {
		var $hash = hash.substr(1);
		for (var i = 0; i < $directory.length; i++) {
			var $item = $directory[i];
			for (var j = 0; j < $item.length; j++) {
				if ($item[j] === $hash) {
					return i;
				}
			}
		}
		return $default;
	}
	function hash_from_index($directory, index) {
		return ($directory[index] || [])[0] || '';
	}
	function refresh_hash_switch_state($directory, choice) {
		var hash_active_class = 'hash-active';
		$.each($(document).find('.hash-switch'), function(index, item) {
			var $item = $(item);
			if ($item.hasClass(choice)) {
				$item.addClass(hash_active_class);
			} else {
				$item.removeClass(hash_active_class);
			}
		});
	}
	var curhash = window.location.hash || '';
	var hash_class_prefix = 'hash-value-';
	var initial_choice = index_from_hash($directory, curhash, 0);
	var initial_choice_hash_class = hash_class_prefix + hash_from_index($directory, initial_choice);
	refresh_hash_switch_state($directory, initial_choice_hash_class);
	window.addEventListener("hashchange", function() {
		var newhash = window.location.hash || '';
		var new_choice = index_from_hash($directory, newhash, -1);
		if (new_choice === -1)
			return;
		var new_choice_hash_class = hash_class_prefix + hash_from_index($directory, new_choice);
		refresh_hash_switch_state($directory, new_choice_hash_class);
	}, false);
	window.hashSwitchDirectory = $directory;
}

mw.hook( 'wikipage.content').add( hashSwitchSetup );

// 外链设置

function externalLinkSetup($content) {
	var $externalLinks = $content.find('.target-blank-fix');
	$.each( $externalLinks, function ( index, $externalLinkContainer ) {
		$.each( $($externalLinkContainer).find('a'), function ( index, $externalLink) {
			$externalLink.target = 'blank';
			$externalLink.rel = 'nofollow noref';
		});
	});	
}

mw.hook( 'wikipage.content').add( externalLinkSetup );

// 让表格横向滚动超出部分
function tableWrapper($content) {
	var $tables = $content.find('table');
	$tables.each(function( index, element ) {
		if ( $(element).hasClass( 'w-100' ) ) {
			$(element).wrap('<div class="overflow-box"></div>');
		}
	});
}

mw.hook( 'wikipage.content').add( tableWrapper );


$(function() {
	// 通用外链样式优化
    $.each($('.exlink'), function (index, item) {
        if ($(item).attr('title')) {
            $('<img src="' + $(item).attr('title') + '" width="16px">').prependTo($(item))
            $(item).removeAttr('title')
        }
        else {
        	item = $(item).children('a')
            var url = $(item).attr('href')
            const domain = url.match(
                /^(http(s)?:\/\/)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/
            )[0]
            var icon = domain + '/favicon.ico'
            $(item).before('<img src="' + icon + '" width="16px" onerror="this.src=\'http://www.google.cn/s2/favicons?domain=' + url + '\'">')
        }
        /*var ico = new Image()
        ico.src = icon
        function iconCheck(ico) {
          return new Promise((resolve, reject) => {
            ico.onload = () => resolve()
            ico.onerror = () => reject()
          })
        }
        await iconCheck(ico)
          .then(() => {
            $(item).before('<img src="' + icon + '" width="16px">')
          })
          .catch(() => {
            $(item).before(
              '<img src="http://www.google.cn/s2/favicons?domain=' + url + '" width="16px">'
            )
          })*/
    })
    
    // 水平目录样式优化
    $.each($('.horizontal-toc .toctitle + ul'), function (index, item) {
        $('<li><a href="#top"><span class="toctext">返回顶部</span></a></li>').prependTo(item)
    })
    $.each($('.horizontal-toc h2'), function (index, item) {
        $(item).append(':')
    })
    
    // 复数目录
    $.each($('.multi-toc'), function (index, item) {
        $(item).append($('#toc').clone())
    })
})