Line 1: |
Line 1: |
− | /** | + | function filterTable(){ |
− | * Scrolling text
| + | $("table.filterable").each(function(){ |
− | *
| + | var i=0; |
− | * Copied from zh.kcwiki.moe
| + | var cols; |
− | */
| + | $(this).find("tr:first-child th, tr:first-child td").each(function(){ |
| + | if (!$(this).hasClass("unfilterable")){ |
| + | cols=[]; |
| + | $(this).closest("table").find("tr td:nth-child("+(i+1)+")").each(function(){ |
| + | cols.push($(this).text()); |
| + | }); |
| + | cols = arrayUnique(cols); |
| + | l=0; |
| + | for (j=0; j<cols.length; j++){ |
| + | t=charLength(cols[j]); |
| + | if (l<t) l=t; |
| + | } |
| + | $(this).css("position","relative"); |
| + | $(this).html('<a href="javascript:void(0)" class="showFilterMenu">'+$(this).html()+'▼</a>'); |
| + | $(this).append($('<div class="filterMenu hidden" style="position: absolute; top: '+$(this).height()+35+'px; left: 0; width: '+(50+l*7)+'px; text-align: left; padding: 5px; border: 1px #333333 solid; -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; background: inherit; z-index: 1"></div>')); |
| + | for (j=0; j<cols.length; j++){ |
| + | $(this).find(".filterMenu").append('<div><input type="checkbox" value="'+cols[j]+'" col="'+(i+1)+'" class="filterOption" checked>'+cols[j]+'</div>'); |
| + | } |
| + | } |
| + | i++; |
| + | }); |
| + | $(this).find("tr:nth-child(n+1)").attr("condition", 0); |
| + | }); |
| + | $(".showFilterMenu").click(function(){ |
| + | if ($(this).parent().find(".filterMenu:visible").length){ |
| + | $(".filterMenu").slideUp(150); |
| + | }else{ |
| + | $(".filterMenu").slideUp(150); |
| + | $(this).parent().find(".filterMenu").slideDown(150); |
| + | } |
| + | }); |
| + | $(document).mouseup(function(e){ |
| + | var container = $(".filterMenu"); |
| + | if (!container.is(e.target) && container.has(e.target).length === 0){ |
| + | container.slideUp(150); |
| + | } |
| + | }); |
| + | $(".filterOption").click(function(){ |
| + | col=$(this).attr("col"); |
| + | val=$(this).val(); |
| + | if ($(this).is(":checked")) chg=1; else chg=-1; |
| + | $(this).closest("table").find("tr:nth-child(n+1)").each(function(){ |
| + | if ($(this).find("td:nth-child("+col+")").text()==val){ |
| + | var cond=$(this).attr("condition"); |
| + | cond=Number(cond)+chg; |
| + | $(this).attr("condition", cond); |
| + | if (cond===0) $(this).show(); |
| + | else $(this).hide(); |
| + | } |
| + | }); |
| + | }); |
| + | } |
| + | |
| + | function arrayUnique(a) { |
| + | return a.reduce(function(p, c) { |
| + | if (p.indexOf(c) < 0) p.push(c); |
| + | return p; |
| + | }, []); |
| + | } |
| | | |
− | function AutoScroll(objNotice) { | + | function charLength(s){ |
− | $(objNotice).find("ul:first").animate({
| + | return s.length+(encodeURI(s).split(/%..|./).length-1-s.length)/2; |
− | marginTop:"-25px"
| |
− | },500,function(){
| |
− | $(this).css({marginTop: "0px"}).find("li:first").appendTo(this);
| |
− | });
| |
| } | | } |
− |
| |
− | $(document).ready(function() {
| |
− | setInterval('AutoScroll("#scrollDiv")',5000);
| |
− | //image loading effect
| |
− | $('img').on('load', function(e){
| |
− | var target = $(this);
| |
− | target.css('opacity', 0).animate({opacity: 1}, 1000);
| |
− | });
| |
− | });
| |
| | | |
− |
| |
− | mw.hook( 'wikipage.content' ).add( createCollapseButtons );
| |
− |
| |
− | /**
| |
− | * Dynamic Navigation Bars (experimental)
| |
− | *
| |
− | * Description: See [[Wikipedia:NavFrame]].
| |
− | * Maintainers: UNMAINTAINED
| |
− | */
| |
− |
| |
− | /* set up the words in your language */
| |
− | var NavigationBarHide = '[' + collapseCaption + ']';
| |
− | var NavigationBarShow = '[' + expandCaption + ']';
| |
− | var indexNavigationBar = 0;
| |
− |
| |
| /** | | /** |
| * Shows and hides content and picture (if available) of navigation bars | | * Shows and hides content and picture (if available) of navigation bars |
Line 53: |
Line 83: |
| /* if shown now */ | | /* if shown now */ |
| if ( NavToggle.firstChild.data === NavigationBarHide ) { | | if ( NavToggle.firstChild.data === NavigationBarHide ) { |
− | for ( NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) { | + | for ( NavChild = NavFrame.firstChild; NavChild !== null; NavChild = NavChild.nextSibling ) { |
| if ( $( NavChild ).hasClass( 'NavContent' ) || $( NavChild ).hasClass( 'NavPic' ) ) { | | if ( $( NavChild ).hasClass( 'NavContent' ) || $( NavChild ).hasClass( 'NavPic' ) ) { |
| NavChild.style.display = 'none'; | | NavChild.style.display = 'none'; |
Line 62: |
Line 92: |
| /* if hidden now */ | | /* if hidden now */ |
| } else if ( NavToggle.firstChild.data === NavigationBarShow ) { | | } else if ( NavToggle.firstChild.data === NavigationBarShow ) { |
− | for ( NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) { | + | for ( NavChild = NavFrame.firstChild; NavChild !== null; NavChild = NavChild.nextSibling ) { |
| if ( $( NavChild ).hasClass( 'NavContent' ) || $( NavChild ).hasClass( 'NavPic' ) ) { | | if ( $( NavChild ).hasClass( 'NavContent' ) || $( NavChild ).hasClass( 'NavPic' ) ) { |
| NavChild.style.display = 'block'; | | NavChild.style.display = 'block'; |
Line 97: |
Line 127: |
| * "collapsed" to the NavFrame itself, just like with collapsible tables. | | * "collapsed" to the NavFrame itself, just like with collapsible tables. |
| */ | | */ |
− | for ( NavChild = NavFrame.firstChild; NavChild != null && !isCollapsed; NavChild = NavChild.nextSibling ) { | + | for ( NavChild = NavFrame.firstChild; NavChild !== null && !isCollapsed; NavChild = NavChild.nextSibling ) { |
| if ( $( NavChild ).hasClass( 'NavPic' ) || $( NavChild ).hasClass( 'NavContent' ) ) { | | if ( $( NavChild ).hasClass( 'NavPic' ) || $( NavChild ).hasClass( 'NavContent' ) ) { |
| if ( NavChild.style.display === 'none' ) { | | if ( NavChild.style.display === 'none' ) { |
Line 105: |
Line 135: |
| } | | } |
| if ( isCollapsed ) { | | if ( isCollapsed ) { |
− | for ( NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) { | + | for ( NavChild = NavFrame.firstChild; NavChild !== null; NavChild = NavChild.nextSibling ) { |
| if ( $( NavChild ).hasClass( 'NavPic' ) || $( NavChild ).hasClass( 'NavContent' ) ) { | | if ( $( NavChild ).hasClass( 'NavPic' ) || $( NavChild ).hasClass( 'NavContent' ) ) { |
| NavChild.style.display = 'none'; | | NavChild.style.display = 'none'; |
Line 127: |
Line 157: |
| | | |
| mw.hook( 'wikipage.content' ).add( createNavigationBarToggleButton ); | | mw.hook( 'wikipage.content' ).add( createNavigationBarToggleButton ); |
− |
| |
− | /**
| |
− | * Collapsible tables
| |
− | *
| |
− | * @version 2.0.2 (2014-03-14)
| |
− | * @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-collapsibleTables.js
| |
− | * @author [[User:R. Koot]]
| |
− | * @author [[User:Krinkle]]
| |
− | * @deprecated Since MediaWiki 1.20: Use class="mw-collapsible" instead which
| |
− | * is supported in MediaWiki core.
| |
− | */
| |
− | /*global $, mw */
| |
− | var autoCollapse = 2;
| |
− | var collapseCaption = 'hide';
| |
− | var expandCaption = 'show';
| |
− |
| |
− | function collapseTable( tableIndex ) {
| |
− | var Button = document.getElementById( 'collapseButton' + tableIndex );
| |
− | var Table = document.getElementById( 'collapsibleTable' + tableIndex );
| |
− |
| |
− | if ( !Table || !Button ) {
| |
− | return false;
| |
− | }
| |
− |
| |
− | var Rows = Table.rows;
| |
− | var i;
| |
− |
| |
− | if ( Button.firstChild.data === collapseCaption ) {
| |
− | for ( i = 1; i < Rows.length; i++ ) {
| |
− | Rows[i].style.display = 'none';
| |
− | }
| |
− | Button.firstChild.data = expandCaption;
| |
− | } else {
| |
− | for ( i = 1; i < Rows.length; i++ ) {
| |
− | Rows[i].style.display = Rows[0].style.display;
| |
− | }
| |
− | Button.firstChild.data = collapseCaption;
| |
− | }
| |
− | }
| |
− |
| |
− | function createClickHandler( tableIndex ) {
| |
− | return function ( e ) {
| |
− | e.preventDefault();
| |
− | collapseTable( tableIndex );
| |
− | };
| |
− | }
| |
− | function createCollapseButtons()
| |
− | {
| |
− | var tableIndex = 0;
| |
− | var NavigationBoxes = new Object();
| |
− | var Tables = getElementsByClassName(document, "table", "collapsible");
| |
− |
| |
− | for ( var i = 0; i < Tables.length; i++ ) {
| |
− | /* only add button and increment count if there is a header row to work with */
| |
− | var HeaderRow = Tables[i].getElementsByTagName( "tr" )[0];
| |
− | if (!HeaderRow) continue;
| |
− | var Header = HeaderRow.getElementsByTagName( "th" )[0];
| |
− | if (!Header) continue;
| |
− |
| |
− | NavigationBoxes[ tableIndex ] = Tables[i];
| |
− | Tables[i].setAttribute( "id", "collapsibleTable" + tableIndex );
| |
− |
| |
− | var Button = document.createElement( "span" );
| |
− | var ButtonLink = document.createElement( "a" );
| |
− | var ButtonText = document.createTextNode( collapseCaption );
| |
− |
| |
− | Button.className = "collapseButton"; //Styles are declared in Common.css
| |
− |
| |
− | ButtonLink.style.color = Header.style.color;
| |
− | ButtonLink.setAttribute( "id", "collapseButton" + tableIndex );
| |
− | ButtonLink.setAttribute( "href", "javascript:collapseTable(" + tableIndex + ");" );
| |
− | ButtonLink.appendChild( ButtonText );
| |
− |
| |
− | Button.appendChild( document.createTextNode( "[" ) );
| |
− | Button.appendChild( ButtonLink );
| |
− | Button.appendChild( document.createTextNode( "]" ) );
| |
− |
| |
− | Header.insertBefore( Button, Header.childNodes[0] );
| |
− | tableIndex++;
| |
− | }
| |
− |
| |
− | var Tables = getElementsByClassName(document, "table", "collapsed");
| |
− | for ( var i = 0; i < Tables.length; i++ ) {
| |
− | collapseTable( i );
| |
− | }
| |
− |
| |
− | var Tables = getElementsByClassName(document, "table", "autocollapse");
| |
− | for ( var i = 0; i < Tables.length; i++ ) {
| |
− | if ( i >= autoCollapse ) {
| |
− | collapseTable( i );
| |
− | }
| |
− | }
| |
− | }
| |
− |
| |
− | mw.hook( 'wikipage.content' ).add( createCollapseButtons );
| |
| | | |
| // Fix Table Header | | // Fix Table Header |
Line 241: |
Line 176: |
| | | |
| this.check = function () { | | this.check = function () { |
− | if($table.size() == 0){ | + | if($table.size() === 0){ |
| return; | | return; |
| } | | } |
Line 247: |
Line 182: |
| var start_offset = $table.offset(); | | var start_offset = $table.offset(); |
| if (scrollTop > start_offset.top && scrollTop <= (start_offset.top + $table.height())) { | | if (scrollTop > start_offset.top && scrollTop <= (start_offset.top + $table.height())) { |
− | // KK: 调节表格宽度: 原表格宽度+边框宽度
| |
− | $newtable.width($table.width() + 2);
| |
| $newtable.show(); | | $newtable.show(); |
| } else { | | } else { |
Line 268: |
Line 201: |
| this.check(); | | this.check(); |
| }; | | }; |
− | } | + | }; |
− |
| + | |
− | $(function () { | + | $(function() { |
− | //Set table
| + | |
| + | // Extension:SoundManager2Button |
| + | // TODO: initialize properly so this isn't needed |
| + | if (window.soundManager && window.soundManager.beginDelayedInit && !window.soundManager.enabled) { |
| + | console.debug('KLUDGE: calling window.soundManager.beginDelayedInit()'); |
| + | window.soundManager.beginDelayedInit(); |
| + | } |
| + | |
| + | // Table things |
| + | |
| + | $(".showExtra").click(function() { |
| + | $(this).closest("table").find(".extraRow").fadeIn("slow");$(this).closest("tr").remove(); |
| + | }); |
| + | |
| + | filterTable(); |
| + | |
| $('.fixtable').each(function(){ | | $('.fixtable').each(function(){ |
| var tableHeadFix = new TableHeadFix(); | | var tableHeadFix = new TableHeadFix(); |
| tableHeadFix.init(this); | | tableHeadFix.init(this); |
| }); | | }); |
| + | |
| + | // Template:Map/ImageNode |
| + | |
| + | function supportTemplateMapImageNode() { |
| + | $('.map-image > span > a').off('click'); |
| + | $('.map-image > span > a').click(function (e) { |
| + | e.preventDefault(); |
| + | var $element = $($(this).attr('href')); |
| + | var $container = $element.parent(); |
| + | $container.scrollTop($container.scrollTop() - $container.offset().top + $element.offset().top); |
| + | }); |
| + | } |
| + | supportTemplateMapImageNode(); |
| + | mw.hook('wikipage.content').add(supportTemplateMapImageNode); |
| + | |
| + | // From gbf.wiki |
| + | // Add a dynamic fixed header to tables with: |
| + | // 1) table with "header-fixed" class |
| + | // 2) a table row with "header-row" class |
| + | // TODO: tablesorter, tabbertab, resize |
| + | // mw.loader.using('jquery.tablesorter', function() { |
| + | var tables = []; |
| + | |
| + | function initializeStickyHeader() { |
| + | var $tables = $('.header-fixed'); |
| + | |
| + | if ($tables.length == 0) return; |
| + | |
| + | $tables.each(function(n) { |
| + | if ($(this).hasClass('header-fixed-done')) return; |
| + | if ($(this).hasClass('mw-collapsed')) { |
| + | console.debug('header-fixed: collapsed: ' + n) |
| + | $(this).find('.mw-collapsible-text').click(function() { |
| + | console.debug('header-fixed: click: ' + n) |
| + | setTimeout(function() { initializeStickyHeader(); }, 1000); |
| + | }) |
| + | return; |
| + | } |
| + | /* |
| + | var tabberTabParent = $(this).parent(".tabbertab")[0]; |
| + | var originalStyleDisplay; |
| + | if (tabberTabParent) { |
| + | originalStyleDisplay = tabberTabParent.style.display; |
| + | tabberTabParent.style.visibility = "hidden"; |
| + | tabberTabParent.style.display = "block"; |
| + | } |
| + | */ |
| + | var $headerRow = $(this).find('.header-row'); |
| + | var $newHeaderContent = $('<tbody>'); |
| + | $newHeaderContent.append($headerRow.clone()); |
| + | |
| + | var $columnsOld = $headerRow.find('td:not([colspan]),th:not([colspan])'); |
| + | var $newHeaderColgroup = $('<colgroup>'); |
| + | for (var i = 0; i < $columnsOld.length; i++) { |
| + | $newHeaderColgroup.append($('<col>').css('width', $columnsOld[i].getBoundingClientRect().width)); |
| + | } |
| + | |
| + | $(this).before( |
| + | $('<table>') |
| + | .addClass('header-fixed-helper') |
| + | .addClass('wikitable') |
| + | .css('position', 'sticky') |
| + | .css('top', '0') |
| + | .css('z-index', '9') |
| + | .css('display', 'none') |
| + | .css('background-color', '#fff') |
| + | .css('margin-top', '0') |
| + | .css('margin-bottom', '0') |
| + | .css('table-layout', 'fixed') |
| + | .append($newHeaderColgroup) |
| + | .append($newHeaderContent) |
| + | ); |
| + | tables.push({ table: this, helper: this.previousSibling }); |
| + | $(this.previousSibling).css('width', $(this).width() + 1); |
| + | /* |
| + | if (tabberTabParent) { |
| + | tabberTabParent.style.visibility = ""; |
| + | tabberTabParent.style.display = originalStyleDisplay; |
| + | } |
| + | */ |
| + | $(this).addClass('header-fixed-done'); |
| + | console.debug('header-fixed: fixed: ' + n) |
| + | }); |
| + | } |
| + | |
| + | $(window).on('scroll', function() { |
| + | var scrollOffset = $(this).scrollTop(); |
| + | for (var i = 0; i < tables.length; i++) { |
| + | var tableOffset = $(tables[i].table).offset().top; |
| + | var tableHeight = $(tables[i].table).height(); |
| + | var helperHeight = $(tables[i].helper).height(); |
| + | if ((scrollOffset > tableOffset) && (scrollOffset < (tableOffset + tableHeight - helperHeight))) { |
| + | if ($(tables[i].helper).is(':hidden')) { |
| + | $(tables[i].helper).show(); |
| + | } |
| + | } else { |
| + | $(tables[i].helper).hide(); |
| + | } |
| + | } |
| + | }); |
| + | |
| + | /* |
| + | var ts = $.fn.tablesorter; |
| + | $.fn.tablesorter = function() { |
| + | ts.apply(this, arguments); |
| + | initializeStickyHeader(); |
| + | } |
| + | */ |
| + | setTimeout(function() { initializeStickyHeader(); }, 1000); |
| + | //}) |
| + | |
| + | // Basic video support using <img> and <video> elements |
| + | |
| + | $('.video').each(function () { |
| + | var src = $(this).data('src') || ''; |
| + | var parts = src.split('.'); |
| + | var ext = parts[parts.length - 1] || ''; |
| + | if (ext === 'webp') { |
| + | var a = $('<a>').addClass('image').attr('href', '/File:' + src); |
| + | var img = $('<img>'); |
| + | for (var attr in $(this).data()) { |
| + | img.attr(attr, (attr === 'src' ? 'https://en.kancollewiki.net/Special:Filepath/' : '') + $(this).data(attr)); |
| + | } |
| + | a.append(img); |
| + | $(this).append(a); |
| + | } else { |
| + | var video = $('<video>').attr('controls', ''); |
| + | var source = $('<source>').attr('type', 'video/' + ext); |
| + | for (var attr in $(this).data()) { |
| + | var el = attr === 'src' || attr === 'type' ? source : video; |
| + | el.attr(attr, (attr === 'src' ? 'https://en.kancollewiki.net/Special:Filepath/' : '') + $(this).data(attr)); |
| + | } |
| + | video.append(source); |
| + | $(this).append(video); |
| + | } |
| + | }); |
| + | |
| }); | | }); |