コンテンツにスキップ

利用者:本日晴天/check headings.js

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

多くの WindowsLinux のブラウザ

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

Mac における Safari

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

Mac における ChromeFirefox

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

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

/*
見出しレベルのチェック

本文中にレベル1の見出しがあった場合、その見出しの直前に警告文を挿入する。
ある見出しが1つ前のものより2レベル以上小さい場合、その見出しの直前に警告文を挿入する。

デフォルトでは標準名前空間のページのみを対象とするが、
このスクリプトを読み込む手前のところで以下の変数を定義することにより、
挙動を変更することができる。

mw.libs.check_headings_always :
	値は真偽値(trueもしくはfalse)とする。
	値がtrueであれば、すべての名前空間(特別ページも含む)を対象とする。
	値がfalseであればcheck_headings_namespacesの設定に従う。
	事前に定義されていなければfalseを指定したときと同じ動作をする。
	定義例:
		mw.libs.check_headings_always = true;

mw.libs.check_headings_namespaces :
	値は対象とする名前空間の番号を要素とする配列とする。
	名前空間の番号については[[Help:名前空間]]を参照のこと。
	mw.libs.check_headings_alwaysの値がtrueであれば、
	mw.libs.check_headings_namespacesでの指定は無視される。
	事前に定義されていなければ[ 0 ]を指定したときと同じ動作をする。
	定義例:
		mw.libs.check_headings_namespaces = [ 0, 10, 14 ];

mw.libs.check_headings_visualedit :
	値は真偽値(trueもしくはfalse)とする。
	値がtrueであればビジュアル編集の画面においても警告文を表示する。
	値がfalseであればビジュアル編集の画面においては警告文を表示しない。
	事前に定義されていなければfalseを指定したときと同じ動作をするが、
	将来的にtrueを指定したときと同じ動作をするよう変更する可能性がある。
	試験的な機能であるため、この変数自体が廃止される可能性もある。
	定義例:
		mw.libs.check_headings_visualedit = true;

*/

( function() {
	'use strict';
	
	if ( [ 'view', 'edit' ].indexOf( mw.config.get( 'wgAction' ) ) === -1 ) {
		return;
	}
	
	var insert_warning = function ( helem, message ) {
		var hobj = $ ( helem );
		var msgobj = $( '<div class="warning" contenteditable=false></div>' );
		msgobj.text( message );
		msgobj.css( "color", "red" );
		msgobj.css( "margin-top", hobj.css( "margin-top" ) );
		hobj.css( "margin-top", "0" );
		msgobj.css( "padding-top", hobj.css( "padding-top" ) );
		hobj.css( "padding-top", "0" );
		$( hobj ).before( msgobj );
	};
	
	var main = function ( selector ) {
		var prehlevel = 1;	// 直前の見出しのレベル
		
		// 節単位で編集中
		if ( mw.config.get( "wgEditMessage" ) === "editingsection" ) {
			prehlevel = 6; // 最初の見出しについてはレベル1でない限り警告を出さない
		}
		
		$( selector ).each( function () {
			// 本文中の各見出しについてこの無名関数を実行する
			
			// 目次か、プレビュー時に挿入される、「プレビュー」と書かれた見出し
			if ( this.id === "mw-toc-heading" || this.id === "mw-previewheader") {
				return;
			}
			
			var hlevel = Number( this.tagName.charAt( 1 ) );	// 見出しレベル
			var msg = "";	// 警告文
			
			if ( hlevel === 1 ) {
				msg = "警告:本文中でレベル1の見出しを使わないでください。";
				hlevel = 2;
				insert_warning ( this, msg );
			}
			else if ( hlevel > prehlevel + 1 ) {
				msg = ( "警告:レベル" +
					hlevel + 
					"の見出しの前にレベル" + 
					( ++prehlevel ) );
				while ( prehlevel < hlevel - 1 ) {
					msg += ( "、レベル" + ( ++prehlevel ) );
				}
				msg += "の見出しが必要です。";
				insert_warning ( this, msg );
			}
			
			prehlevel = hlevel;
		} );
	};
	
	var always = false;
	var namespaces = [ 0 ];
	if ( 'check_headings_always' in mw.libs ) {
		always = mw.libs.check_headings_always;
	} else if ( 'check_headings_namespaces' in mw.libs ) {
		namespaces = mw.libs.check_headings_namespaces;
	}
	
	var ns = mw.config.get( "wgNamespaceNumber" );
	if ( ( !always ) && ( namespaces.indexOf( ns ) === -1 ) ) {
		return;
	}
	
	if ( mw.libs.check_headings_visualedit ) {
		mw.hook( 've.activationComplete' ).add( function () {
			main( ".ve-ce-documentNode :header" );
		} );
	}
	$( function () {
		main( "#mw-content-text :header" );
	} );
} )();