「MediaWiki:Common.js」の版間の差分
削除された内容 追加された内容
2007年5月7日 (月) 04:04 (UTC) Kahusi氏の編集を復元 |
en:MediaWiki:Common.js より移入: hasClass(), Collapsible tables, Dynamic Navigation Bars |
||
1行目: | 1行目: | ||
//<source lang="javascript"> |
|||
/* ここに書いたスクリプトは全ての外装に反映されます */ |
/* ここに書いたスクリプトは全ての外装に反映されます */ |
||
// Improvement of the search page v4 |
// Improvement of the search page v4 |
||
214行目: | 215行目: | ||
return str; |
return str; |
||
} |
} |
||
/* Test if an element has a certain class ************************************** |
|||
* |
|||
* Description: Uses regular expressions and caching for better performance. |
|||
* Maintainers: [[:en:User:Mike Dillon]], [[:en:User:R. Koot]], [[:en:User:SG]] |
|||
*/ |
|||
var hasClass = (function () { |
|||
var reCache = {}; |
|||
return function (element, className) { |
|||
return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className); |
|||
}; |
|||
})(); |
|||
/** Collapsible tables ********************************************************* |
|||
* |
|||
* Description: Allows tables to be collapsed, showing only the header. See |
|||
* [[Wikipedia:NavFrame]]. |
|||
* Maintainers: [[:en:User:R. Koot]] |
|||
*/ |
|||
var autoCollapse = 2; |
|||
var collapseCaption = "隠す"; |
|||
var expandCaption = "表示"; |
|||
function collapseTable( tableIndex ) |
|||
{ |
|||
var Button = document.getElementById( "collapseButton" + tableIndex ); |
|||
var Table = document.getElementById( "collapsibleTable" + tableIndex ); |
|||
if ( !Table || !Button ) { |
|||
return false; |
|||
} |
|||
var Rows = Table.getElementsByTagName( "tr" ); |
|||
if ( Button.firstChild.data == collapseCaption ) { |
|||
for ( var i = 1; i < Rows.length; i++ ) { |
|||
Rows[i].style.display = "none"; |
|||
} |
|||
Button.firstChild.data = expandCaption; |
|||
} else { |
|||
for ( var i = 1; i < Rows.length; i++ ) { |
|||
Rows[i].style.display = Rows[0].style.display; |
|||
} |
|||
Button.firstChild.data = collapseCaption; |
|||
} |
|||
} |
|||
function createCollapseButtons() |
|||
{ |
|||
var tableIndex = 0; |
|||
var NavigationBoxes = new Object(); |
|||
var Tables = document.getElementsByTagName( "table" ); |
|||
for ( var i = 0; i < Tables.length; i++ ) { |
|||
if ( hasClass( Tables[i], "collapsible" ) ) { |
|||
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.style.styleFloat = "right"; |
|||
Button.style.cssFloat = "right"; |
|||
Button.style.fontWeight = "normal"; |
|||
Button.style.textAlign = "right"; |
|||
Button.style.width = "6em"; |
|||
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( "]" ) ); |
|||
var Header = Tables[i].getElementsByTagName( "tr" )[0].getElementsByTagName( "th" )[0]; |
|||
/* only add button and increment count if there is a header row to work with */ |
|||
if (Header) { |
|||
Header.insertBefore( Button, Header.childNodes[0] ); |
|||
tableIndex++; |
|||
} |
|||
} |
|||
} |
|||
for ( var i = 0; i < tableIndex; i++ ) { |
|||
if ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) { |
|||
collapseTable( i ); |
|||
} |
|||
} |
|||
} |
|||
addOnloadHook( createCollapseButtons ); |
|||
/** Dynamic Navigation Bars (experimental) ************************************* |
|||
* |
|||
* Description: See [[Wikipedia:NavFrame]]. |
|||
* Maintainers: UNMAINTAINED |
|||
*/ |
|||
// set up the words in your language |
|||
var NavigationBarHide = '[' + collapseCaption + ']'; |
|||
var NavigationBarShow = '[' + expandCaption + ']'; |
|||
// set up max count of Navigation Bars on page, |
|||
// if there are more, all will be hidden |
|||
var 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 |
|||
function toggleNavigationBar(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 ( hasClass( NavChild, 'NavPic' ) ) { |
|||
NavChild.style.display = 'none'; |
|||
} |
|||
if ( hasClass( NavChild, '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 (hasClass(NavChild, 'NavPic')) { |
|||
NavChild.style.display = 'block'; |
|||
} |
|||
if (hasClass(NavChild, 'NavContent')) { |
|||
NavChild.style.display = 'block'; |
|||
} |
|||
} |
|||
NavToggle.firstChild.data = NavigationBarHide; |
|||
} |
|||
} |
|||
// adds show/hide-button to navigation bars |
|||
function createNavigationBarToggleButton() |
|||
{ |
|||
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 (hasClass(NavFrame, "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 (hasClass(NavFrame.childNodes[j], "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); |
|||
} |
|||
} |
|||
} |
|||
addOnloadHook( createNavigationBarToggleButton ); |
|||
//</source> |
2007年6月13日 (水) 02:55時点における版
//<source lang="javascript">
/* ここに書いたスクリプトは全ての外装に反映されます */
// Improvement of the search page v4
// Auteur : Marc Mongenet & Suisui
// Source licenced GFDL & GPL
function SpecialSearchEnhanced()
{
function SearchForm(engine_name, engine_url, logo_url, search_action_url,
search_field_name, add_search_field, field_array)
{
var span= document.createElement("span");
span.style.marginRight = "1em";
var form = document.createElement("form");
form.method = "get";
form.action = search_action_url;
form.style.display = "inline";
span.appendChild(form);
var input = document.createElement("input");
input.type = "hidden";
input.name = search_field_name;
form.appendChild(input);
for( var i in field_array){
var fld = document.createElement("input");
fld.type = "hidden";
fld.name = i;
fld.value = field_array[i];
form.appendChild(fld);
}
var submit = document.createElement("input");
submit.type = "submit";
submit.value = "検索";
form.appendChild(submit);
form.onsubmit = function() {
if(add_search_field == ""){
input.value = document.getElementById("lsearchbox").value;
}else{
input.value = document.getElementById("lsearchbox").value+add_search_field;
}
}
var a = document.createElement("a");
a.href = engine_url;
span.appendChild(a);
var img = document.createElement("img");
img.src = logo_url;
img.alt = engine_name;
img.style.borderWidth = "0";
img.style.padding = "5px";
img.style.width = "135px";
img.style.height = "35px";
a.appendChild(img);
return span;
}
if (typeof SpecialSearchEnhancedDisabled != 'undefined') return;
if (wgCanonicalNamespace != "Special" || wgCanonicalSpecialPageName != "Search") return;
if(skin == "monobook" || skin == "cologneblue" || skin == "simple"){var mainNode = document.getElementsByTagName("form");}
if (!mainNode) return;
mainNode = mainNode[0];
mainNode.appendChild(document.createElement("center"));
mainNode = mainNode.lastChild;
var searchValue = document.getElementById("lsearchbox").value;
var div= document.createElement("div");
div.style.width = "100%";
// ul.style.list-style-type = "none";
mainNode.appendChild(div);
var engine;
var goodsearcho = new Object();
goodsearcho["charityid"] = "812661";
engine = SearchForm("GoodSearch", "http://www.goodsearch.com/", "http://www.goodsearch.com/_gfx/title_smaller.gif",
"http://www.goodsearch.com/Search.aspx",
"Keywords", "+site:ja.wikipedia.org", goodsearcho);
div.appendChild(engine);
var googleo = new Object();
googleo["as_sitesearch"] = "ja.wikipedia.org";
engine = SearchForm("Google", "http://www.google.co.jp/", "http://www.google.co.jp/logos/powered_by_google_135x35.gif",
"http://www.google.co.jp/search",
"q", "", googleo);
div.appendChild(engine);
var yahoojo = new Object();
yahoojo["vs"] = "ja.wikipedia.org";
yahoojo["ei"] = "UTF-8";
engine = SearchForm("Yahoo!", "http://www.yahoo.co.jp/", "http://img.yahoo.co.jp/images/yahoojp.gif",
"http://search.yahoo.co.jp/search",
"p", "", yahoojo);
div.appendChild(engine);
var msliveo = new Object();
msliveo["q1"] = "site:ja.wikipedia.org"
engine = SearchForm("Live", "http://search.live.com/", "http://ads.msn.com/ads/pronws/ideas/en/us/EN_Logo_Right_Live.gif",
"http://search.live.com/results.aspx",
"q", "", msliveo);
div.appendChild(engine);
var gooo = new Object();
gooo["Domain"] = "ja.wikipedia.org";
gooo["IE"] = "UTF-8";
gooo["DS"] = "IN";
engine = SearchForm("goo", "http://www.goo.ne.jp/", "http://help.goo.ne.jp/img/link/pb_goo.gif",
"http://search.goo.ne.jp/web.jsp",
"MT", "", gooo);
div.appendChild(engine);
var altavistao = new Object();
altavistao["aqmode"] = "s";
altavistao["rc"] = "dmn";
altavistao["swd"] = "ja.wikipedia.org"
engine = SearchForm("altavista", "http://www.altavista.com/", "http://us.i1.yimg.com/us.yimg.com/i/us/av/logo_srp.gif",
"http://www.altavista.com/web/results",
"aqa", "", altavistao);
div.appendChild(engine);
}
addOnloadHook(SpecialSearchEnhanced);
/** "Technical restrictions" title fix *****************************************
*
* Description:
* Maintainers: [[en:User:Interiot]], [[en:User:Mets501]]
*/
// For pages that have something like Template:Lowercase, replace the title, but only if it is cut-and-pasteable as a valid wikilink.
// (for instance [[iPod]]'s title is updated. <nowiki>But [[C#]] is not an equivalent wikilink, so [[C Sharp]] doesn't have its main title changed)</nowiki>
//
// The function looks for a banner like this: <nowiki>
// <div id="RealTitleBanner"> <!-- div that gets hidden -->
// <span id="RealTitle">title</span>
// </div>
// </nowiki>An element with id=DisableRealTitle disables the function.
var disableRealTitle = 0; // users can disable this by making this true from their monobook.js
if (wgIsArticle) { // don't display the RealTitle when editing, since it is apparently inconsistent (doesn't show when editing sections, doesn't show when not previewing)
addOnloadHook(function() {
try {
var realTitleBanner = document.getElementById("RealTitleBanner");
if (realTitleBanner && !document.getElementById("DisableRealTitle") && !disableRealTitle) {
var realTitle = document.getElementById("RealTitle");
if (realTitle) {
var realTitleHTML = realTitle.innerHTML;
realTitleText = pickUpText(realTitle);
var isPasteable = 0;
//var containsHTML = /</.test(realTitleHTML); // contains ANY HTML
var containsTooMuchHTML = /</.test( realTitleHTML.replace(/<\/?(sub|sup|small|big)>/gi, "") ); // contains HTML that will be ignored when cut-n-pasted as a wikilink
// calculate whether the title is pasteable
var verifyTitle = realTitleText.replace(/^ +/, ""); // trim left spaces
verifyTitle = verifyTitle.charAt(0).toUpperCase() + verifyTitle.substring(1, verifyTitle.length); // uppercase first character
// if the namespace prefix is there, remove it on our verification copy. If it isn't there, add it to the original realValue copy.
if (wgNamespaceNumber != 0) {
if (wgCanonicalNamespace == verifyTitle.substr(0, wgCanonicalNamespace.length).replace(/ /g, "_") && verifyTitle.charAt(wgCanonicalNamespace.length) == ":") {
verifyTitle = verifyTitle.substr(wgCanonicalNamespace.length + 1);
} else {
realTitleText = wgCanonicalNamespace.replace(/_/g, " ") + ":" + realTitleText;
realTitleHTML = wgCanonicalNamespace.replace(/_/g, " ") + ":" + realTitleHTML;
}
}
// verify whether wgTitle matches
verifyTitle = verifyTitle.replace(/^ +/, "").replace(/ +$/, ""); // trim left and right spaces
verifyTitle = verifyTitle.replace(/_/g, " "); // underscores to spaces
verifyTitle = verifyTitle.charAt(0).toUpperCase() + verifyTitle.substring(1, verifyTitle.length); // uppercase first character
isPasteable = (verifyTitle == wgTitle);
var h1 = document.getElementsByTagName("h1")[0];
if (h1 && isPasteable) {
h1.innerHTML = containsTooMuchHTML ? realTitleText : realTitleHTML;
if (!containsTooMuchHTML)
realTitleBanner.style.display = "none";
}
document.title = realTitleText + " - Wikipedia";
}
}
} catch (e) {
/* Something went wrong. */
}
});
}
// similar to innerHTML, but only returns the text portions of the insides, excludes HTML
function pickUpText(aParentElement) {
var str = "";
function pickUpTextInternal(aElement) {
var child = aElement.firstChild;
while (child) {
if (child.nodeType == 1) // ELEMENT_NODE
pickUpTextInternal(child);
else if (child.nodeType == 3) // TEXT_NODE
str += child.nodeValue;
child = child.nextSibling;
}
}
pickUpTextInternal(aParentElement);
return str;
}
/* Test if an element has a certain class **************************************
*
* Description: Uses regular expressions and caching for better performance.
* Maintainers: [[:en:User:Mike Dillon]], [[:en:User:R. Koot]], [[:en:User:SG]]
*/
var hasClass = (function () {
var reCache = {};
return function (element, className) {
return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
};
})();
/** Collapsible tables *********************************************************
*
* Description: Allows tables to be collapsed, showing only the header. See
* [[Wikipedia:NavFrame]].
* Maintainers: [[:en:User:R. Koot]]
*/
var autoCollapse = 2;
var collapseCaption = "隠す";
var expandCaption = "表示";
function collapseTable( tableIndex )
{
var Button = document.getElementById( "collapseButton" + tableIndex );
var Table = document.getElementById( "collapsibleTable" + tableIndex );
if ( !Table || !Button ) {
return false;
}
var Rows = Table.getElementsByTagName( "tr" );
if ( Button.firstChild.data == collapseCaption ) {
for ( var i = 1; i < Rows.length; i++ ) {
Rows[i].style.display = "none";
}
Button.firstChild.data = expandCaption;
} else {
for ( var i = 1; i < Rows.length; i++ ) {
Rows[i].style.display = Rows[0].style.display;
}
Button.firstChild.data = collapseCaption;
}
}
function createCollapseButtons()
{
var tableIndex = 0;
var NavigationBoxes = new Object();
var Tables = document.getElementsByTagName( "table" );
for ( var i = 0; i < Tables.length; i++ ) {
if ( hasClass( Tables[i], "collapsible" ) ) {
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.style.styleFloat = "right";
Button.style.cssFloat = "right";
Button.style.fontWeight = "normal";
Button.style.textAlign = "right";
Button.style.width = "6em";
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( "]" ) );
var Header = Tables[i].getElementsByTagName( "tr" )[0].getElementsByTagName( "th" )[0];
/* only add button and increment count if there is a header row to work with */
if (Header) {
Header.insertBefore( Button, Header.childNodes[0] );
tableIndex++;
}
}
}
for ( var i = 0; i < tableIndex; i++ ) {
if ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) {
collapseTable( i );
}
}
}
addOnloadHook( createCollapseButtons );
/** Dynamic Navigation Bars (experimental) *************************************
*
* Description: See [[Wikipedia:NavFrame]].
* Maintainers: UNMAINTAINED
*/
// set up the words in your language
var NavigationBarHide = '[' + collapseCaption + ']';
var NavigationBarShow = '[' + expandCaption + ']';
// set up max count of Navigation Bars on page,
// if there are more, all will be hidden
var 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
function toggleNavigationBar(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 ( hasClass( NavChild, 'NavPic' ) ) {
NavChild.style.display = 'none';
}
if ( hasClass( NavChild, '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 (hasClass(NavChild, 'NavPic')) {
NavChild.style.display = 'block';
}
if (hasClass(NavChild, 'NavContent')) {
NavChild.style.display = 'block';
}
}
NavToggle.firstChild.data = NavigationBarHide;
}
}
// adds show/hide-button to navigation bars
function createNavigationBarToggleButton()
{
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 (hasClass(NavFrame, "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 (hasClass(NavFrame.childNodes[j], "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);
}
}
}
addOnloadHook( createNavigationBarToggleButton );
//</source>