コンテンツにスキップ

利用者:Mizusumashi/Script/ModifyEditsection.js

お知らせ: 保存した後、ブラウザのキャッシュをクリアしてページを再読み込みする必要があります。

多くの WindowsLinux のブラウザ

  • Ctrl を押しながら F5 を押す。

Mac における Safari

  • Shift を押しながら、更新ボタン をクリックする。

Mac における ChromeFirefox

  • Cmd Shift を押しながら R を押す。

詳細についてはWikipedia:キャッシュを消すをご覧ください。

/**********************************************************************
 * セクション編集リンク 変更
 * (1) 冒頭部編集用のセクション編集リンクをつける
 * (2) セクション編集リンクをセクション・ヘッドラインの右に移動させる
 * (3) トランスクルードされたセクションのセクション編集リンクを拡張する
 *
 *   dbenzhuser (de:Benutzer:Dbenzhuser)
 *   Alex Smotrov (en:User:Alex Smotrov)
 *   TheDJ (en:User:TheDJ)
 *   mizusumashi (ja:User:Mizusumashi)
 **********************************************************************/

jQuery(document).ready( function( $ ){
	var action = mw.config.get( 'wgAction' );
	var ns = mw.config.get( 'wgNamespaceNumber' );

	var client = $.client.profile();
	var ie7 = false; // client.name == 'msie' && client.versionBase == '7';

	var top = mw.user.options.get( 'modifyEditSection.top', false );
	var move = mw.user.options.get( 'modifyEditSection.move', false );
	var expand = mw.user.options.get( 'modifyEditSection.expand', true ) && ( ns == 4 || ns % 2 == 1 );
	var effect = mw.user.options.get( 'modifyEditSection.effect', ! ie7 );

	var $edits = $( 'span.editsection' );

	if( ( action != 'view' && action != 'purge' )
		|| ns < 0
		|| ( ! top && ! move && ! expand )
		|| ! $edits.length ){
		return;
	}

	var path = mw.config.get( 'wgScript' );
	var page = new (function(){
		this.name = mw.config.get( 'wgPageName' );
		this.uri =  mw.util.wikiUrlencode( this.name );
	})();

	var message = (function(){
		var lang = mw.config.get( 'wgUserLanguage' );
		var messages = {
			en : {
				topEdit : {
					text : 'edit',
					title : 'Edit lead section'
				},
				view : {
					text : 'open',
					title : 'Open "${src}#${sec}"'
				},
				history : {
					text : 'history',
					title : 'Past version of "${src}"'
				},
				watch : {
					text : 'watch',
					title : 'Add "${src}" to your watchlist'
				},
				unwatch : {
					text : '-',
					title : 'Remove "${src}" from your watchlist'
				},
				purge : {
					text : 'purge',
					title : 'Clear the cache of "${page}" and view the last version of "${src}"'
				}
			},
			ja : {
				topEdit : {
					text : '編集',
					title : '導入部を編集'
				},
				view : {
					text : '閲覧',
					title : '「${src}#${sec}」を閲覧"'
				},
				history : {
					text : '履歴',
					title : '「${src}」の履歴'
				},
				watch : {
					text : 'ウォッチ',
					title : '「${src}」をウォッチリストに追加'
				},
				unwatch : {
					text : '-',
					title : '「${src}」をウォッチリストから削除'
				},
				purge : {
					text : '更新',
					title : '「${page}」を更新し、「${src}」の最新版を反映'
				}
			}
		};

		return messages[lang] ? messages[lang] : messages['en'];
	})();

	function addTop(){
		var skin = mw.util.getParamValue( 'useskin' ) || mw.user.options.get( 'skin' );

		var $heading;
		switch( skin ){
			case 'standard':
			case 'cologneblue':
			case 'nostalgia':
				$heading = $( 'h1.pagetitle:first' );
				break;
			case 'simple':
			case 'chick':
			case 'myskin':
			case 'monobook':
			case 'vector':
			case 'modern':
				$heading = $( '#firstHeading:first' );
				break;
			default:
				mw.log('can\'t get $heading');
				return;
		}

		function top( klass ){
			return '<span class="' + klass + ' editsection-top">[<a href="'
				+ path
				+ '?title=' + page.uri
				+ '&action=edit&section=0" title="'
				+ message.topEdit.title + '">'
				+ message.topEdit.text
				+ '</a>]</span>';
		}

		if( move ){
			$heading.append( ' ' );
			$heading.append( top( 'editsection-moved' ) );

		}else{
			$heading.prepend( ' ' );
			$heading.prepend( top( 'editsection' ) );
		}
	}

	function doMove( $parent, $edit ){
		$edit = $edit.clone();
		$edit.removeClass( 'editsection' );
		$edit.addClass( 'editsection-moved' );

		$parent.append( ' ' );
		$parent.append( $edit );

		return $edit;
	}

	var doExpand = (function(){
		var anonymous = ! mw.config.get( 'wgUserName' );
		var memo = new (function(){
			this.table = [];
			this.check = function( key, value ){
				if( typeof this.table[key] == 'undefined' ){
					this.table[key] = value;
				}
				return this.table[key];
			};
		})();

		var stack = new (function(){
			this.array = [page.uri];
			this.pointer = 0;
			this.set = function( level, uri ){
				for( var i = this.pointer + 1; i < level; i++ ){
					this.array[i] = this.array[this.pointer];
				}
				this.array[level] = uri;
				this.pointer = level;
			};
			this.needExpand = function(){
				return this.array[this.pointer - 1] != stack.array[this.pointer];
			};
		})();

		return function expand( $parent, $edit ){
			var $headline = $parent.find( 'span.mw-headline:first' );
			var $a = $edit.find( 'a:first' );

			var level = Number( $parent.get( 0 ).tagName.replace( /h/i, '' ) );
			var href = $a.attr( 'href' );

			var src = {
				name : $a.attr( 'title' ),
				uri : href.match( /(&|\?)title=([^&]+)/ )[2]
			};

			var name = mw.html.escape( $.trim( $headline.text() ) );
			var id = $parent.prev().attr( 'id' ) || $headline.attr( 'id' );
			var mid = memo.check( src.name + '#' + name, id );

			if( href.match( /&section=T-\d+/ )  ){
				stack.set( level, src.uri );
				if( ! stack.needExpand() ){
					return;
				}
			}else{
				stack.set( level, page.uri );
				return;
			}

			function link( act, uri ){
				var msg = message[act];
				return '<a href ="'
					+ path
					+ '?action=' + act + '&title=' + uri + '"'
					+ ' title="'
					+ msg.title
					.replace( '${page}', page.name )
					.replace( '${sec}', name )
					.replace( '${src}', src.name )
					+ '">'
					+ msg.text
					+ '</a>';
			};

			var extensions = '<span class="editsection-extensions">';
			extensions +=
				'['
				+ link( 'view', src.uri + '#' + mid )
				+ ']['
				+ link( 'history', src.uri )
				+ ']';

			if( ! anonymous ){
				extensions +=
					'['
					+ link( 'watch', src.uri )
					+ '('
					+ link( 'unwatch', src.uri )
					+ ')]';
			}

			if( action != 'purge' ){
				extensions +=
					'['
					+ link( 'purge', page.uri + '#' + id )
					+ ']';
			}

			extensions += '</span>';
			$edit.addClass('editsection-extended').append( extensions );
		};

	})();

	function modify(){
		if( top ){
			addTop();
		}

		if( ! move && ! expand ){
			return;
		}

		$edits.each( function(){
			var $edit = $( this );
			var $parent = $edit.parent( 'h1, h2, h3, h4, h5, h6' );

			if( move ){
				$edit = doMove( $parent, $edit );
			}

			if( expand ){
				doExpand( $parent, $edit );
			}
		});
	}

	function modifyWithoutFade(){
		modify();
		if( move ){
			$edits.detach();
		}
	}

	function modifyWithFade(){
		var $head = $( 'head' );
		var styles = [];
		var qn = 'modifyEditSection';

		var step = 4;
		var delay = 75;

		function css(selector, display, opacity){
			var $style = $( '<style type="text/css" media="screen">'
				+ selector + ' { display: ' + display
				+ '; opacity: ' + opacity + ';  -moz-opacity: ' + opacity
				+ '; filter: alpha(opacity=' + ~~(opacity * 100) + ');}'
				+ '</style>' );
			$head.queue( qn, function(next){
				$head.append( $style );
				styles.push( $style );
				next();
			});
		}

		function fadeOut(selector){
			for(var i = step - 1; i >= 0; i--){
				css( selector, 'inline', i / step);
				$head.delay( delay, qn );
			}
		}

		function fadeIn(selector){
			for(var i = 1; i <= step; i++){
				css( selector, 'inline', i / step);
				$head.delay( delay, qn );
			}
		}

		css( 'span.editsection-top, span.editsection-moved, span.editsection-extensions', 'none', 0 );
		$head.dequeue( qn );

		modify();

		if( move ){
			fadeOut( 'span.editsection' );
			$head.queue( qn, function(next){
				$edits.detach();
				next();
			});
			css( 'span.editsection-extensions', 'inline', 1 );
			fadeIn( 'span.editsection-moved' );
		}else if( expand ){
			fadeOut( 'span.editsection-extended' );
			css( 'span.editsection-extensions', 'inline', 1 );
			fadeIn( 'span.editsection-top, span.editsection-extended' );
		}else{
			fadeIn( 'span.editsection-top' );
		}

		$head.queue( qn, function(next){
			$.each( styles, function( i, $style ){
				$style.detach();
			});
			next();
		});

		$head.dequeue( qn );
	}

	if( effect ){
		modifyWithFade();
	}else{
		modifyWithoutFade();
	}
});