「Common.js」の版間の差分
Music765plus (トーク | 投稿記録) |
Music765plus (トーク | 投稿記録) |
||
(同じ利用者による、間の8版が非表示) | |||
1行目: | 1行目: | ||
/* ここにあるすべてのJavaScriptは、すべてのページ読み込みですべての利用者に対して読み込まれます */ | /* ここにあるすべてのJavaScriptは、すべてのページ読み込みですべての利用者に対して読み込まれます */ | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
// <source lang="javascript"> | // <source lang="javascript"> | ||
/* ここに書いたスクリプトは全ての外装に反映されます */ | /* ここに書いたスクリプトは全ての外装に反映されます */ | ||
930行目: | 924行目: | ||
mw.popups.render.API_DELAY = 50; | mw.popups.render.API_DELAY = 50; | ||
}); | }); | ||
+ | |||
// </source> | // </source> |
2024年11月1日 (金) 08:08時点における最新版
/* ここにあるすべてのJavaScriptは、すべてのページ読み込みですべての利用者に対して読み込まれます */ // <source lang="javascript"> /* ここに書いたスクリプトは全ての外装に反映されます */ typeof mw != 'undefined' && (function() { /* mw に依存する部分の始まり */ // wgから始まるグローバル変数をローカル変数とする var wgPageName = mw.config.get('wgPageName'); var wgIsArticle = mw.config.get('wgIsArticle'); var wgAction = mw.config.get('wgAction'); var wgNamespaceNumber = mw.config.get('wgNamespaceNumber'); /** &withJS= URL parameter, &withCSS= URL parameter ******* * [[en:MediaWiki:Common.js]] より。MediaWiki空間に置かれているスクリプトまたはスタイルシートを * [[Special:Mypage/vector.js]]または[[Special:Mypage/vector.css]]を編集しないで体験できるようにする */ mw.loader.using(['mediawiki.util', 'mediawiki.notify', 'mediawiki.legacy.wikibits']).done( function () { var extraCSS = mw.util.getParamValue( 'withCSS' ), extraJS = mw.util.getParamValue( 'withJS' ); if ( extraCSS ) { if ( extraCSS.match( /^MediaWiki:[^&<>=%#]*\.css$/ ) ) { importStylesheet( extraCSS ); } else { mw.notify( 'MediaWiki 名前空間のページのみ許可されています。', { title: 'withCSS パラメータの値が不正です' } ); } } if ( extraJS ) { if ( extraJS.match( /^MediaWiki:[^&<>=%#]*\.js$/ ) ) { importScript( extraJS ); } else { mw.notify( 'MediaWiki 名前空間のページのみ許可されています。', { title: 'withJS パラメータの値が不正です' } ); } } }); /* * [[特別:検索]]に外部検索サイト選択用のプルダウンメニューをつける */ if (wgPageName == '特別:検索') { mw.loader.using('mediawiki.legacy.wikibits').done(function(){ importScript('MediaWiki:Common.js/SpecialSearchEnhanced.js'); }); } /** * Test if an element has a certain class * @deprecated: Use $(element).hasClass() instead. */ mw.log.deprecate( window, 'hasClass', function ( element, className ) { return $( element ).hasClass( className ); }, 'Use jQuery.hasClass() instead' ); /** * Collapsible tables ********************************************************* * * Description: Allows tables to be collapsed, showing only the header. See * [[Wikipedia:NavFrame]]. * Maintainers: [[User:R. Koot]] */ window.autoCollapse = 2; window.collapseCaption = "隠す"; window.expandCaption = "表示"; window.collapseTable = function ( 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; } }; window.createCollapseButtons = function() { var tableIndex = 0; var NavigationBoxes = {}; var Tables = document.getElementsByTagName( 'table' ); var i; function handleButtonLink( index, e ) { window.collapseTable( index ); e.preventDefault(); } for ( i = 0; i < Tables.length; i++ ) { if ( $( Tables[i] ).hasClass( 'collapsible' ) ) { /* 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', '#' ); $( ButtonLink ).on( 'click', $.proxy( handleButtonLink, ButtonLink, tableIndex ) ); ButtonLink.appendChild( ButtonText ); Button.appendChild( document.createTextNode( '[' ) ); Button.appendChild( ButtonLink ); Button.appendChild( document.createTextNode( ']' ) ); Header.insertBefore( Button, Header.firstChild ); tableIndex++; } } for ( i = 0; i < tableIndex; i++ ) { if ( $( NavigationBoxes[i] ).hasClass( 'collapsed' ) || ( tableIndex >= autoCollapse && $( NavigationBoxes[i] ).hasClass( 'autocollapse' ) ) ) { window.collapseTable( i ); } else if ( $( NavigationBoxes[i] ).hasClass ( 'innercollapse' ) ) { var element = NavigationBoxes[i]; while ((element = element.parentNode)) { if ( $( element ).hasClass( 'outercollapse' ) ) { window.collapseTable ( i ); break; } } } } }; // mw.hook( 'wikipage.content' ).add( createCollapseButtons ); $(createCollapseButtons); // 応急処置 /** Dynamic Navigation Bars (experimental) ************************************* * * Description: See [[Wikipedia:NavFrame]]. * Maintainers: UNMAINTAINED */ // set up the words in your language window.NavigationBarHide = '[' + collapseCaption + ']'; window.NavigationBarShow = '[' + expandCaption + ']'; // set up max count of Navigation Bars on page, // if there are more, all will be hidden window.NavigationBarShowDefault = 0; // all bars will be hidden // NavigationBarShowDefault = 1; // on pages with more than 1 bar all bars will be hidden //var NavigationBarShowDefault = autoCollapse; // shows and hides content and picture (if available) of navigation bars // Parameters: // indexNavigationBar: the index of navigation bar to be toggled window.toggleNavigationBar = function(indexNavigationBar) { var NavToggle = document.getElementById("NavToggle" + indexNavigationBar); var NavFrame = document.getElementById("NavFrame" + indexNavigationBar); if (!NavFrame || !NavToggle) { return false; } // if shown now if (NavToggle.firstChild.data == NavigationBarHide) { for ( var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) { if ( $( NavChild ).hasClass( 'NavPic' ) ) { NavChild.style.display = 'none'; } if ( $( NavChild ).hasClass( 'NavContent') ) { NavChild.style.display = 'none'; } } NavToggle.firstChild.data = NavigationBarShow; // if hidden now } else if (NavToggle.firstChild.data == NavigationBarShow) { for ( var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) { if ( $( NavChild ).hasClass( 'NavPic')) { NavChild.style.display = 'block'; } if ( $( NavChild ).hasClass( 'NavContent')) { NavChild.style.display = 'block'; } } NavToggle.firstChild.data = NavigationBarHide; } }; // adds show/hide-button to navigation bars window.createNavigationBarToggleButton = function() { var indexNavigationBar = 0; // iterate over all < div >-elements var divs = document.getElementsByTagName("div"); for( var i=0; NavFrame = divs[i]; i++ ) { // if found a navigation bar if ($(NavFrame).hasClass("NavFrame")) { indexNavigationBar++; var NavToggle = document.createElement("a"); NavToggle.className = 'NavToggle'; NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar); NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');'); var NavToggleText = document.createTextNode(NavigationBarHide); NavToggle.appendChild(NavToggleText); // Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked) for( var j=0; j < NavFrame.childNodes.length; j++ ) { if ($(NavFrame.childNodes[j]).hasClass("NavHead")) { NavFrame.childNodes[j].appendChild(NavToggle); } } NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar); } } // if more Navigation Bars found than Default: hide all if (NavigationBarShowDefault < indexNavigationBar) { for( var i=1; i<=indexNavigationBar; i++ ) { toggleNavigationBar(i); } } }; $( createNavigationBarToggleButton ); ///////////////////////////////////////////////////////////////// // 記事名チェッカ 1.0 written by Tietew and Hatukanezumi ///////////////////////////////////////////////////////////////// /* * 無効化のフラグ変数。無効化は、利用者のユーザスクリプトで真に設定することでする。 */ window.disableTitleChecker = false; /* * 記事名チェッカによる処理を適用しない記事名のリスト (除外リスト)。 */ window.TitleChecker_exclude = [ // [名前空間番号, 項目名], ... ]; /* * 記事名を検査し、結果を返す。 * 引数: * ns: 名前空間番号 (標準: 0; ノート: 1; ...)。 * title: 項目名。 * body: 項目本文の内容。 * 返値: * [処理, [[説明文, [ガイドライン等, ...]], ...], リダイレクトの即時削除対象になりうるかどうか] * ただし、処理が「許可」であるときは false。 */ window.TitleChecker_check = function(ns, title, body) { var platform; // プラットフォームを識別する名称。 var is_redirect; // リダイレクトであるかどうか。 var action = 0; // 処理。0: 許可する; 1: 警告する; 2: 拒否する. var reason = []; var for_redirect = false; var do_check = function (pattern, newaction, message, guides) { var re, m, matched, msgstr; re = new RegExp(pattern, "g"); m = title.match(re); if (m && (matched = m.join(" "))) { if (newaction > action) action = newaction; msgstr = message; msgstr = msgstr.replace("%s", matched); msgstr = msgstr.replace("%%", "%"); reason.push([msgstr, guides]); if (guides && is_redirect) for ( var i = 0; i < guides.length; i++) if (guides[i] == "Wikipedia:即時削除の方針#リダイレクト") { for_redirect = true; break; } } }; title = title.replace(/_/g, ' '); // 記事ごとの無効化。除外リストにあれば検査をしない。 if (TitleChecker_exclude) for ( var i = 0; i < TitleChecker_exclude.length; i++) if (TitleChecker_exclude[i][0] == ns && TitleChecker_exclude[i][1] == title) return false; // プラットフォームの判別。 // check for AppleWebKit/416 (Safari/2.0.2) or later var safari = navigator.userAgent.match(/\bAppleWebKit\/(\d+)/); if(safari && safari[1] < 416) platform = 'Safari/1.x'; // リダイレクトであるかどうかの判定。 is_redirect = (body && body.match(/^#redirect[[\t\r\n ]/i)); /* * 書式の検査 */ // 記事名の全体を「」または『』などでくくっているもの、ないしは、その後に曖昧さ回避の括弧があるもの。 if (platform != 'Safari/1.x') do_check( "^[「『].*[」』]([ _]+[(][^)]+[)])?$", 1, "記事名が鈎括弧でくくられています。芸術作品のタイトルは鈎括弧でくくるべきではありません(正式名称に鉤括弧を含むものは例外です)。", ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:記事名の付け方#小説・詩・映画・舞台・音楽・絵画など芸術作品のタイトル"]); // 記事名の末尾の括弧書きに半角の小括弧(丸括弧)を使用する場合に、左括弧の前に半角スペースがないもの。 // 注: 入れ子は2重まで。 do_check( "[^ ][(]([(][^()]*[)]|[^()])*[)]$", 1, "記事名の最後の左括弧の前に半角スペースがありません: %s。曖昧さ回避の括弧である場合は、括弧の前に半角スペースを入れてください。名称自体に括弧を含んでいる場合はこの限りではありません。", ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:曖昧さ回避#曖昧さ回避の種類と方法"]); // 記事名に半角の小括弧(丸括弧)を使用する場合に、括弧の左右が対称でないもの。 // 注: 入れ子は2重まで。 if (platform != 'Safari/1.x') do_check( "[(]([(][^()()]*[)]|[(][^()()]*[)]|[^()()])*[)]|[(]([(][^()()]*[)]|[(][^()()]*[)]|[^()()])*[)]", 1, "括弧の左右が対称ではありません: %s。両方を、半角括弧か全角括弧に統一してください。", ["Wikipedia:即時削除の方針#リダイレクト"]); // 記事名に実体参照または数値文字参照を含んでいるもの。 do_check( "([&][#]?[\dA-Za-z]+;)+", 2, "記事名に実体参照を含んでいます: %s。実体参照を記事名に使うべきではありません。", ["Wikipedia:記事名の付け方#特殊記号の使用は慎重にすること"]); /* * 使用文字種の検査 */ // 技術的な考慮 (拒否) if (platform != 'Safari/1.x') do_check( "[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDFFE\uDFFF]", 2, "文字でないものを含んでいます。文字でないものを記事名に使うべきではありません。"); if (platform != 'Safari/1.x') do_check( "[\u0080-\u009F\uFFF0-\uFFFD\uDB40-\uDB7F]", 2, "制御文字を含んでいます。制御文字を記事名に使うべきではありません。"); if (platform != 'Safari/1.x') do_check( "[\u00A0]", 2, "ノーブレークスペースを含んでいます。通常のスペースを使ってください。"); if (platform != 'Safari/1.x') do_check("[\u00AD]", 2, "ソフトハイフンを含んでいます。ソフトハイフンを記事名に使うべきではありません。"); if (platform != 'Safari/1.x') do_check( "[\u2000-\u200A\u200B\u205F]", 2, "特別な幅のスペースを含んでいます。通常のスペースを使ってください。"); if (platform != 'Safari/1.x') do_check( "[\u200C\u200D\u2060]", 2, "書式制御文字を含んでいます。一部の言語ではこの文字を使いますが、記事名には日本語を使ってください。", ["Wikipedia:記事名の付け方#日本語を使うこと"]); if (platform != 'Safari/1.x') do_check( "[\u2011]", 2, "ノンプレーキングハイフンを含んでいます。ハイフンマイナス (-) を使ってください。"); if (platform != 'Safari/1.x') do_check( "[\u2028-\u202E\u2061-\u206F]", 2, "書式制御文字を含んでいます。書式制御文字を記事名に使うべきではありません。"); if (platform != 'Safari/1.x') do_check( "[\u202F]", 2, "特別な幅のノーブレークスペースを含んでいます。通常のスペースを使ってください。"); if (platform != 'Safari/1.x') do_check( "[\uE000-\uF8FF\uDB80-\uDBFF]", 2, "私用文字を含んでいます。私用文字 (外字) を記事名に使うべきではありません。"); if (platform != 'Safari/1.x') do_check( "[\uFEFF]", 2, "不可視な文字を含んでいます。この文字を記事名に使うべきではありません。"); // その他のガイドライン等 (警告) if (platform != 'Safari/1.x') do_check( "[\u2160-\u217F]+", 1, "ローマ数字を含んでいます: %s。これは機種依存文字です。ローマ数字は半角英字 (iやVなど) を並べて表記してください。", ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:表記ガイド#ローマ数字"]); if (platform != 'Safari/1.x') do_check( "[\u2460-\u2473\u24EA-\u24FF\u3251-\u325F\u32B1-\u32BF]+", 1, "丸数字を含んでいます: %s。これは機種依存文字です。代わりに (1), (2), (3) を使用してください。", ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:表記ガイド#丸数字"]); if (platform != 'Safari/1.x') do_check( "[\u2474-\u24B5\u3200-\u3250\u32C0-\u32CF\u3300-\u33FF]+", 1, "組文字を含んでいます: %s。片仮名や、漢字、英数字で表記してください。これは機種依存文字である場合もあります。", ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:表記ガイド#略記号", "Wikipedia:表記ガイド#文字コード"]); if (platform != 'Safari/1.x') do_check( "[\u3000]", 1, "全角空白を含んでいます。全角空白を記事名に使うべきではありません。", ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:記事名の付け方#全角と半角の使い分け"]); if (platform != 'Safari/1.x') do_check( "[\uFB00-\uFEFE\uFFE0-\uFFE7\uFFE8-\uFFEF]+", 1, "機種依存文字を含んでいます: %s。機種依存文字を記事名に使うべきではありません。", ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:表記ガイド#文字コード"]); if (platform != 'Safari/1.x') do_check( "[\uFF10-\uFF19]+", 1, "全角数字を含んでいます: %s。全角英数字を記事名に使うべきではありません。", ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:記事名の付け方#全角と半角の使い分け"]); if (platform != 'Safari/1.x') do_check( "[\uFF21-\uFF3A\uFF41-\uFF5A]+", 1, "全角英字を含んでいます: %s。全角英数字を記事名に使うべきではありません。", ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:記事名の付け方#全角と半角の使い分け"]); if (platform != 'Safari/1.x') do_check( "[\uFF00\uFF02\uFF04-\uFF07\uFF0A-\uFF0F\uFF1B\uFF20\uFF3C\uFF3E-\uFF40\uFF5F-\uFF60]+", 1, "全角英記号を含んでいます: %s。全角英記号を記事名に使うべきではありません。", ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:記事名の付け方#全角と半角の使い分け"]); if (platform != 'Safari/1.x') if (!is_redirect) do_check( // リダイレクトでない場合のみ "[\uFF5E]+", 1, "全角チルダを含んでいます。この文字は、一部の環境で正しく表示されません。波ダッシュ (〜) か、できればハイフンマイナス (-) を使ってください。波ダッシュを使った記事名へのリダイレクトを作成しようとしている場合は、この限りではありません。", ["Wikipedia:表記ガイド#波ダッシュ"]); if (platform != 'Safari/1.x') do_check( "[\uFF61-\uFF9F]+", 1, "半角片仮名を含んでいます: %s。半角片仮名を記事名に使うべきではありません。", ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:記事名の付け方#全角と半角の使い分け"]); if (platform != 'Safari/1.x') do_check( "[\uFFA0-\uFFDF]+", 1, "半角ハングル字母を含んでいます: %s。半角ハングル字母を記事名に使うべきではありません。", ["Wikipedia:即時削除の方針#リダイレクト", "Wikipedia:記事名の付け方#全角と半角の使い分け"]); if (action == 0) return false; return [action, reason, for_redirect]; }; /* * 記事名を検査した結果を表示する。 * 引数: * mark: 説明文などを挿入する場所のelement。 * action: 処理。 * reason: [[説明文, [ガイドライン等, ...]], ...] * for_redirect: リダイレクトの即時削除対象でありうるかどうか。 * 返値: * なし。 */ window.TitleChecker_warn = function(mark, action, reason, for_redirect) { // wgから始まるグローバル変数をローカル変数とする var wgPageName = mw.config.get('wgPageName'); var wgArticleId = mw.config.get('wgArticleId'); var esc = function(str) { var e = document.createElement('div'); e.appendChild(document.createTextNode(str)); return e.innerHTML; }; var wl = function(title) { title = title.replace(/_/g, ' '); return '' + esc(arguments[1] || title) + ''; }; var text = ''; text = text + '<p><strong>警告: このページの記事名の付け方は、' + '当ウィキペディアのガイドラインなどにそっていないかもしれません。' + '理由は以下のとおりです。</strong></p>'; if (reason) { text = text + '<ul>'; for ( var i = 0; i < reason.length; i++) { text = text + '<li>' + esc(reason[i][0]); if (reason[i][1]) { var rl = []; for ( var j = 0; j < reason[i][1].length; j++) { rl.push(wl(reason[i][1][j])); } text = text + '詳しくは、' + rl.join('、') + 'を参照してください。'; } text = text + '</li>'; } text = text + '</ul>'; } text = text + '<p>ガイドラインにそっていないときは、記事名の変更を検討してみてください。' + 'なお、記事名を変更したときは、' + wl('特別:Whatlinkshere/' + wgPageName, 'このページのリンク元') + 'を調べて、新しい記事へのリンクに変更するようにしてください。</p>' + '<p>記事名チェック機能の詳細は、' + wl('Help:記事名のチェック') + 'をご覧ください。</p>'; if (for_redirect && wgArticleId) text = text + '<p>編集中のページは' + wl('Wikipedia:リダイレクト', 'リダイレクト') + 'ですが、' + '即時削除に出せるかもしれません。' + 'リダイレクトの即時削除に出すことができるのは、以下のすべてが該当する場合です。</p><ul>' + '<li>項目名の書き誤りで、それが誰が見ても明らかに誤りだとわかる。</li>' + '<li>項目が有益な履歴を持っていない。</li>' + '<li>項目がどこからもリンクされていない。</li>' + '</ul><p>リダイレクトの即時削除についての詳細は、' + wl('Wikipedia:即時削除の方針')+'を参照してください。</p>'; var div = document.createElement('div'); div.innerHTML = text; mark.parentNode.insertBefore(div, mark.nextSibling); return; }; /* * 記事名チェッカの処理を実行する。 * 引数: * なし。 * 返値: * なし。 */ window.TitleChecker = function() { var dis = function() { for(var i = 0; i < arguments.length; ++i) { var e = document.getElementById(arguments[i]); if(e) e.disabled = true; } }; // wgから始まるグローバル変数をローカル変数とする var wgNamespaceNumber = mw.config.get('wgNamespaceNumber'); var wgTitle = mw.config.get('wgTitle'); var wgArticleId = mw.config.get('wgArticleId'); // 利用者ごとの無効化。 if (disableTitleChecker) return; // 検査は標準名前空間の記事に対してのみ行う。 if (wgNamespaceNumber != 0) return; // 検査は利用者が新規作成または編集しようとしたときにのみ行う。 var editform = document.getElementById('editform'); if(!editform) return; // 検査して結果を得る。 var nc = TitleChecker_check(wgNamespaceNumber, wgTitle, document.getElementById('wpTextbox1').value); // 検査の結果、次のいずれかの処理を行う。 // 許可: 「警告」や「拒否」に該当する処理をしない場合は、何もしない。 if(!nc) return; // 拒否: 編集をできなくする。 if (nc[0] > 1) { if(wgArticleId == 0) { editform.parentNode.removeChild(editform); } else { dis('wpSummary', 'wpMinoredit', 'wpWatchthis', 'wpSave', 'wpPreview', 'wpDiff'); document.getElementById('wpTextbox1').readOnly = true; } } // 警告と拒否: 説明文を表示する。 var mark; switch(skin) { case 'standard': case 'cologneblue': case 'nostalgia': mark = document.getElementById('specialpages') ? document.getElementById('topbar') : $('h1.pagetitle')[0].nextSibling; break; default: mark = document.getElementById('jump-to-nav') || document.getElementById('contentSub'); } TitleChecker_warn(mark, nc[0], nc[1], nc[2]); return; }; /* * 以上の処理は、ページ読み込みの際に実行する。 */ $(TitleChecker); /* * modifyEditsection * (3) トランスクルードされた節の節編集リンクを拡張する * * dbenzhuser (de:Benutzer:Dbenzhuser) * Alex Smotrov (en:User:Alex Smotrov) * TheDJ (en:User:TheDJ) * mizusumashi (ja:User:Mizusumashi) * cpro (ja:User:Cpro) */ if( (mw.config.get('wgAction') == 'view' || mw.config.get('wgAction') == 'purge') && // Wikipedia名前空間、または各種ノートページのみで実行 (mw.config.get('wgNamespaceNumber') == 4 || mw.config.get('wgNamespaceNumber') % 2 == 1 ) && // window.expandEditsectionDisable = true を設定していれば、機能を無効化できる (typeof window.expandEditsectionDisable === 'undefined' || !window.expandEditsectionDisable)) { $(function() { /** mw.config の内容を保持 */ var conf = mw.config.get([ 'wgPageName', 'wgUserLanguage', 'wgServer', 'wgScript', 'wgUserName', 'wgAction' ]); /** * デバッグ・モード * window.expandEditsectionDebug = true をユーザースクリプトで設定していれば、機能を有効化できる */ var debug = typeof window.modifyEditsectionDebug !== 'undefined' && window.modifyEditsectionDebug; /** * 節編集リンクを保持 * トランスクルードされた節編集リンク(section=T-n を含む)を子要素に持つ span.mw-editsection */ var $editSectionLinks = $('span.mw-editsection').has('a[href*="§ion=T-"]'); // editsection が存在しなければ何もしない。 if($editSectionLinks.length === 0) { return; } // メッセージのセットアップ var messages = { en: { 'openTitle' : 'open', 'openDescription' : 'Open "$1#$2"', 'historyTitle' : 'history', 'historyDescription' : 'Past version of "$1"', 'watchTitle' : 'watch', 'watchDescription' : 'Add "$1" to your watchlist', 'unwatchDescription' : 'Remove "$1" from your watchlist', 'purgeTitle' : 'purge', 'purgeDescription' : 'Clear the cache of "$1" and view the last version of "$2"' }, ja: { 'openTitle' : '閲覧', 'openDescription' : '「$1#$2」を閲覧"', 'historyTitle' : '履歴', 'historyDescription' : '「$1」の履歴', 'watchTitle' : 'ウォッチ', 'watchDescription' : '「$1」をウォッチリストに追加', 'unwatchDescription' : '「$1」をウォッチリストから削除', 'purgeTitle' : '更新', 'purgeDescription' : '「$1」を更新し、「$2」の最新版を反映' } }; var myMessage = messages[conf.wgUserLanguage] || {}; myMessage.historyTitle = myMessage.historyTitle || $('#ca-history').text(); /** * キーを指定して現在の言語設定に対応するメッセージを取得する * 第2引数以降に指定があれば、メッセージ内のプレースホルダー * "$1", "$2"" ... を指定した文字列で置換する */ var message = function(key){ var msg = myMessage[key] || messages.en[key]; for(var i = 1; i < arguments.length; i++) { msg = msg.replace('$' + i.toString(), arguments[i]); } return msg; }; /** * クエリ付きのMediaWiki URIを生成する (.../w/index.php?title=...) */ var getUri = function(pageName, action, fragment) { var uri = new mw.Uri(conf.wgServer + conf.wgScript); uri.query = { title: pageName, action: action }; if(fragment) uri.fragment = fragment; return uri.toString(); }; /** 拡張リンクのmushtacheテンプレート */ var extensionTemplate = mw.template.add('_client', 'sectionEditLinkExtension.mustache', '<span class="editsection-extensions">' + '<span class="mw-editsection-bracket">[</span>' + '{{#extension}}' + '{{^skip}}' + '{{^first}}<span class="mw-editsection-divider"> | </span>{{/first}}' + '{{text}}' + '{{#unwatchHref}}(-){{/unwatchHref}}' + '{{/skip}}' + '{{/extension}}' + '<span class="mw-editsection-bracket">]</span>' + '{{#debug}}' + '<span title="{{debugMsg}}">*</span>' + '{{/debug}}' + '</span>'); /** 拡張処理済みの節編集リンクの名前・見出しレベルを保持する */ var expanded = {}; // 節編集リンクを順次処理 $editSectionLinks.each(function(i, editSectionSpan) { var debugMsg = ''; var href = $('a[href*="§ion=T-"]', editSectionSpan).attr('href'); /** トランスクルードされているページ名 */ var transcluded = (new mw.Uri(href)).query.title; /** 節編集リンクを含んでいるh*要素 */ var parentHn = editSectionSpan.parentNode; /** 節の見出しレベル */ var level = Number(parentHn.tagName.replace(/h/i, '')); // 以前に同じページからのトランスクルードがあり、かつ見出しレベルが下がっていれば、拡張しない if(expanded[transcluded] && level > expanded[transcluded]){ return; } expanded[transcluded] = level; var $section = $('span.mw-headline', parentHn); var sectionName = $.trim($section.text()); /** 節リンク用識別子(URLの # 以降) */ var sectionFragment = $section.attr('id'); /** テンプレートに渡すデータ */ var data = { extension: [ { // 閲覧 text: message('openTitle'), href: getUri(transcluded, 'view', sectionFragment), title: message('openDescription', transcluded, sectionName) }, { // 履歴 text: message('historyTitle'), href: getUri(transcluded, 'history'), title: message('historyDescription', transcluded) }, { // ウォッチリスト追加/削除 text: message('watchTitle'), href: getUri(transcluded, 'watch'), title: message('watchDescription', transcluded), unwatchHref: getUri(transcluded, 'unwatch'), unwatchTitle: message('unwatchDescription', transcluded), // ログインしていない場合はウォッチリストの処理をスキップ skip: conf.wgUserName === null && extParam.text == message('watchTitle') }, { // 更新 text: message('purgeTitle'), href: getUri(conf.wgPageName, 'purge', sectionFragment), title: message('purgeDescription', conf.wgPageName, transcluded), // パージ直後の場合はパージの処理をスキップ skip: conf.wgAction == 'purge' && extParam.text == message('purgeTitle') } ], debug: debug, debugMsg: debugMsg }; data.extension[0].first = true; // 最初の要素を認識させる(区切り線追加をスキップするため) $(editSectionSpan).append(extensionTemplate.render(data)); }); // ビジュアルエディターが無効だと区切り線が非表示なので強制表示 $('.editsection-extensions .mw-editsection-divider').show(); }); } // modifyEditsection - end if /** Magic editintros **************************************************** * * Description: 特定カテゴリの記事の編集画面にヘッダテンプレートを表示する * (編集リンクに "&editintro=Template:hogehoge" を付加する) * Maintainers: [[利用者:Cpro]] */ mw.loader.using(['mediawiki.util']).done(function() { // カテゴリ名と表示テンプレートの対応テーブル。名前空間は書かない。 var CATEGORY_EDITINTRO_TABLE = { '存命人物': 'BLP editintro' , '学校記事': '学校記事 editintro' /* , 'カテゴリ名': 'テンプレート名' */ }; //編集・節節編集リンクにeditintro引数を追加する(VisualEditorを除く) function addEditIntro(templateName) { $('#ca-edit a, .mw-editsection a[class!=mw-editsection-visualeditor]').each(function() { this.href += '&editintro=' + mw.util.wikiUrlencode(templateName); }); } if (mw.config.get('wgNamespaceNumber') === 0) { $(function(){ var cats = mw.config.get('wgCategories'); if(!cats) return; for(var i = 0; i < cats.length; i++) { var ei = CATEGORY_EDITINTRO_TABLE[cats[i]]; if(ei) { addEditIntro('Template:' + ei); return; } } }); } }); // 検索ボックス入力時の全角・半角文字正規化 mw.loader.using('mediawiki.legacy.wikibits').done(function(){ importScript('MediaWiki:Common.js/NormalizeCharWidth.js'); }); /* * 要約欄でエンターキーを押した際に投稿されないようにする * * window.summaryEnterRejectDisable - * この機能を無効化させるには jQuery.ready が呼び出されるまでに true にする */ $( function() { // 未定義であるか、無効化されてなければ if ( typeof summaryEnterRejectDisable === 'undefined' || summaryEnterRejectDisable == false ) { // キーが押されたとき $( "#wpSummary" ).keypress( function( e ) { // エンターキーならば if ( e.keyCode == 13 ) { // イベントをキャンセル e.preventDefault(); } }); // アクセシビリティを考慮 $( "#wpSave" ).css( "font-weight" , "normal" ); } }); /* * 拡張型折りたたみ要素(EnhancedCollapsibleElements) * 説明書:[[ヘルプ:拡張型折りたたみ可能要素]] */ mw.loader.using('mediawiki.legacy.wikibits').done(function(){ importScript('MediaWiki:EnhancedCollapsibleElements.js'); }); /* == Username replace function == * Originally by [[uncyclopedia:User:Splaka|Splaka]], updated by same. * <span class="insertusername"></span> の中身を利用者名で置き換える * window.disableUsernameReplace = true; で無効 * * [[Wikipedia:管理者への立候補/利用者名抽出機能の設定方法]]を参照 */ window.disableUsernameReplace = false; $(function() { var userName = mw.config.get('wgUserName'); if(window.disableUsernameReplace || userName === null) return; $('span.insertusername').each(function(i, span) { for(var j = 0; j < span.childNodes.length; j++) { var node = span.childNodes[j]; if(node.nodeType == 3) { //span内で最初のテキストノードを探し利用者名で置換する node.nodeValue = userName; break; } } }); }); /* mw に依存する部分の終わり */ }()); /* popups用のjavascript記述です */ mw.loader.using( [ 'ext.popups' ], function() { // wait for popups to be loaded // Time to wait in ms before showing a popup on hover. 既定値は 500 です。 mw.popups.render.POPUP_DELAY = 500; // Time to wait in ms before closing a popup on de-hover. 既定値は 300 です。 mw.popups.render.POPUP_CLOSE_DELAY = 300; // Time to wait in ms before starting the API queries on hover, must be <= POPUP_DELAY. 既定値は 50 です。 // Don't change this unless you know what you're doing. mw.popups.render.API_DELAY = 50; }); // </source>