کاربر:Yair rand/TabbedLanguages.js
نکته: پس از انتشار ممکن است برای دیدن تغییرات نیاز باشد که حافظهٔ نهانی مرورگر خود را پاک کنید.
- فایرفاکس / سافاری: کلید Shift را نگه دارید و روی دکمهٔ Reload کلیک کنید، یا کلیدهای Ctrl-F5 یا Ctrl-R را با هم فشار دهید (در رایانههای اپل مکینتاش کلیدهای ⌘-R)
- گوگل کروم: کلیدهای Ctrl+Shift+R را با هم فشار دهید (در رایانههای اپل مکینتاش کلیدهای ⌘-Shift-R)
- اینترنت اکسپلورر/ Edge: کلید Ctrl را نگهدارید و روی دکمهٔ Refresh کلیک کنید، یا کلیدهای Ctrl-F5 را با هم فشار دهید
- اپرا: Ctrl-F5 را بفشارید.
function newNode(tagname){
var node = document.createElement(tagname);
for( var i=1;i<arguments.length;i++ ){
if(typeof arguments[i] == 'string'){ //Text
node.appendChild( document.createTextNode(arguments[i]) );
}else if(typeof arguments[i] == 'object'){
if(arguments[i].nodeName){ //If it is a DOM Node
node.appendChild(arguments[i]);
}else{ //Attributes (hopefully)
for(var j in arguments[i]){
if(j == 'class'){ //Classname different because...
node.className = arguments[i][j];
}else if(j == 'style'){ //Style is special
node.style.cssText = arguments[i][j];
}else if(typeof arguments[i][j] == 'function'){ //Basic event handlers
try{ node.addEventListener(j,arguments[i][j],false); //W3C
}catch(e){try{ node.attachEvent('on'+j,arguments[i][j],"Language"); //MSIE
}catch(e){ node['on'+j]=arguments[i][j]; }}; //Legacy
}else{
node.setAttribute(j,arguments[i][j]); //Normal attributes
}
}
}
}
}
return node;
}
// This is a (very) modified version of User:Atelaes/TabbedLanguages.js.
// Tabbed languages with tabs on the side.
// Tabs design by [[User:Jorm (WMF)]]
// Code still needs cleaning up
var tabbedLanguages = tabbedLanguages || [],
languageContainers = languageContainers || [],
currentLanguageTab = currentLanguageTab || 0,
languageHeaderEditButtons = languageHeaderEditButtons || [],
tocLangSections, tabstable, loadremovecatbuttons = true;
function makeLanguageTabs() {
if ((mw.config.get('wgNamespaceNumber') == 0 || mw.config.get('wgPageName') == "Wiktionary:Sandbox") && mw.config.get('wgAction') != 'edit' && $.cookie('disable-tabbed-languages') == null && location.search.indexOf("tabbedlanguages=off") == -1 && !window.loadedTabs) {
window.loadedTabs = true;
// importStylesheet("User:Yair_rand/TabbedLanguages.css")
var languageContainer, li, language, toc = document.getElementById('toc'), languageLinks, ttr,
catDiv = document.getElementById('mw-normal-catlinks'),
isIE9, bodyContent_ = $(".mw-content-rtl")[0]; // hopefully temporary fix
//document.getElementById('wikiPreview') || document.getElementById('bodyContent') || document.getElementById('mw_contentholder') || document.getElementById('article') || document.getElementById('content');
if( !bodyContent_ ){return}
// Dump everything into a documentfragment, to be put back at the end (this is somehow faster, I don't know why)
var bodyContent = document.createDocumentFragment();
while (bodyContent_.firstChild) bodyContent.appendChild(bodyContent_.firstChild);
tabstable = newNode('table', {id: 'tabstable'},
newNode('tbody',
ttr = newNode('tr',
newNode('td', {'style': 'padding-top:0px;vertical-align:top;'},
newNode('table', {'style': 'margin-top: -2px;'},
languageLinks = newNode('tbody', {id: 'languageLinks'}))))))
window.toggleLanguageTabs = function (language) {
// Find the destination language.
for (var destinationLanguageTab = tabbedLanguages.length - 1; destinationLanguageTab >= 0; destinationLanguageTab--) {
if (language.indexOf(tabbedLanguages[destinationLanguageTab]) == 0) {
break;
}
}
// Style the right toggle button, hide the old language section and show the new one, rm the old toc and add the new one.
// var languageButtons = document.getElementById('languageLinks').getElementsByTagName('span');
var languageButtons = $("#languageLinks .selectedTab, #languageLinks .unselectedTab");
if (destinationLanguageTab >= 0) {
languageButtons[currentLanguageTab].className = 'unselectedTab';
languageContainers[currentLanguageTab].style.display = 'none';
if (document.getElementById('toc')) {
tocLangSections[currentLanguageTab].style.display = 'none';
tocLangSections[destinationLanguageTab].style.display = 'list-item';
}
currentLanguageTab = destinationLanguageTab
languageButtons[destinationLanguageTab].className = 'selectedTab'
languageContainers[currentLanguageTab].style.display = 'table-cell';
if (languageHeaderEditButtons.length) {
tabstable.parentNode.removeChild(tabstable.previousSibling)
tabstable.parentNode.insertBefore(languageHeaderEditButtons[currentLanguageTab], tabstable)
}
if (isIE9) {
for (var ols = languageContainers[currentLanguageTab].getElementsByTagName('ol'), i = 0; i < ols.length; i++) {
(function (i) {
setTimeout(function () {
ols[i].removeChild(ols[i].insertBefore(document.createElement('li'), ols[i].firstChild))
}, 0)
})(i)
}
}
} else if ((language = language.replace(/\ /g, '_')) && document.getElementById(language) && document.getElementById(language).parentNode.parentNode.className == 'languageContainer') {
toggleLanguageTabs(document.getElementById(language).parentNode.parentNode.id.split('container')[0])
}
}
// Look through all the nodes in bodyContent, placing them in the correct language containers.
for (var child = bodyContent.firstChild; child && (child.nodeName != "H2" || child.getElementsByTagName('span').length == 0); child = child.nextSibling);
for (child = child && bodyContent.insertBefore(tabstable, child).nextSibling; child && child.className != 'printfooter' && child.className != 'catlinks'; child = child.nextSibling) {
if (child.nodeName == 'H2') {
var spans = child.getElementsByTagName('span');
if (spans.length != 0 && (language = (language = spans[1] && spans[1].className == 'mw-headline' && languageHeaderEditButtons.push(spans[0]) && spans[1] || spans[0]).innerText || language.textContent)) {
tabbedLanguages.push(language);
languageContainers.push(languageContainer = ttr.appendChild(newNode('td', {
'class': 'languageContainer',
'id': language + 'container'
})));
bodyContent.removeChild(child);
child = tabstable
}
} else {
child.nodeName != "HR" ? languageContainer.appendChild(child) : bodyContent.removeChild(child);
child = tabstable
}
}
if (toc) {
toc.style.display = 'none';
}
if (tabbedLanguages.length > 0) {
try {
if (toc) {
if (toc.getElementsByClassName) {
tocLangSections = toc.getElementsByClassName('toclevel-1');
for (var c = 1; c < tocLangSections.length; c++) {
tocLangSections[c].style.display = 'none'
}
} else {
tocLangSections = []
for (var c = 0, temptocbox = toc.getElementsByTagName('ul')[0]; c < temptocbox.childNodes.length; c++) {
if (temptocbox.childNodes[c].nodeName == "LI") {
if (tocLangSections.length) temptocbox.childNodes[c].style.display = 'none';
tocLangSections.push(temptocbox.childNodes[c])
}
}
}
}
// Make the toggle.
for (var b = 0; b < tabbedLanguages.length; b++) {
language = tabbedLanguages[b];
languageLinks.appendChild(newNode('tr', newNode('td', {
'class': (b ? 'un' : '') + 'selectedTab'
}, newNode('a', language, {
'href': location.pathname + location.search + '#' + language
}), ' ')))
}
// If there are section edit links, add edit link, and a new language button.
if (languageHeaderEditButtons.length) {
if (window.addPOSHeader) // this functionality requires adddefinition.js, editor.js, and TabbedLanguages.js at the same time
languageLinks.appendChild(newNode('tr', newNode('td', {
'class': 'unselectedTab',
style: 'cursor:pointer;'
}, newNode('a', 'Add language', {
'style': 'font-size:12px;padding:3px 6px;',
'click': newLanguageTab,
'title': 'Add new language section'
}))));
for (var b = 0; b < languageHeaderEditButtons.length; b++) {
languageHeaderEditButtons[b].className += " editlangsection"
}
bodyContent.insertBefore(languageHeaderEditButtons[0], tabstable);
}
for (var a = 0; a < languageContainers.length; a++) {
languageContainer = languageContainers[a];
if (a != 0) {
languageContainer.style.display = 'none';
}
// Put a container in each for categories.
languageContainer.appendChild(newNode('div', languageContainer.id.split('container')[0] + ' رده: ', newNode('ul'), {
'class': 'catlinks',
'id': 'catlinks'
}));
}
// Now for category sorting
if (catDiv) {
var cats = catDiv.getElementsByTagName('li'),
catname,
langcurrent = 0,
catskip = 1;
do {
while (cats.length > 0) {
var z = 0;
catname = cats[z].getElementsByTagName('a')[0].innerHTML;
if ( ~(~catname.indexOf(tabbedLanguages[langcurrent + catskip])||1e9) == catname.length - (tabbedLanguages[langcurrent + catskip]||'').length) {
langcurrent += catskip;
catskip = 1;
}
while (z--+1) {
var currentCatDiv = languageContainers[langcurrent].lastChild;
currentCatDiv.lastChild.appendChild(cats[0]);
}
}
if (langcurrent + 1 < languageContainers.length - catskip) {
while (currentCatDiv.childNodes[1]) {
catDiv.lastChild.appendChild(currentCatDiv.childNodes[1]);
}
catskip++;
} else {
break;
}
} while (true)
}
// place patrol link at the bottom of the page
var pl = languageContainer.lastChild.previousSibling;
if(pl && pl.className == "patrollink"){
bodyContent.appendChild(pl)
}
// rm old cat box, allow display of hidden cats box
if (catDiv && !(catDiv.nextSibling && catDiv.nextSibling.className == "mw-hidden-cats-user-shown")) {
catDiv.parentNode.parentNode.removeChild(catDiv.parentNode)
} else {
if (catDiv) {
catDiv.parentNode.removeChild(catDiv);
}
}
// put everything back into the bodyContent
bodyContent_.appendChild(bodyContent);
bodyContent = bodyContent_;
} catch (e) {
if (bodyContent_ != bodyContent) {
'console' in window && typeof console.log == "function" && console.log(e);
bodyContent_.appendChild(bodyContent);
bodyContent = bodyContent_;
}
}
if (isIE9 = $.client.profile().name == "msie" && $.client.profile().versionNumber == 9) { // IE9 is EVIL
tocLangSections = toc.getElementsByClassName('toclevel-1');
toggleLanguageTabs(tabbedLanguages[currentLanguageTab])
}
// If there's a location hash, the window may have scrolled down before we got a chance to reorganize everything.
// If the destination was a subsection or sense id, switch to the right tab, and rescroll.
// If it was simply a language, switch to the appropriate tab, and scroll back up.
if (location.hash != '') {
var hash = decodeURI(location.hash).substr(1);
var destination = hash.replace(/_/g, ' ');
toggleLanguageTabs(destination);
if (document.getElementById(hash)) {
resetHash()
} else {
window.scrollY && window.scroll(0, 0);
}
} else {
if ('localStorage' in window) {
if ($.inArray(localStorage.langTabPref, tabbedLanguages) != -1) {
toggleLanguageTabs(tabbedLanguages[$.inArray(localStorage.langTabPref, tabbedLanguages)])
}
}
}
if ("onhashchange" in window && (document.documentMode === undefined || document.documentMode > 7)) {
window.onhashchange = hashToggleLT;
} else {
jQuery(bodyContent_).delegate('a[href^="' + location.pathname + location.search + '#"], a[href^="#"]', 'click', function () {
setTimeout(hashToggleLT, 10)
})
}
if ('localStorage' in window) {
window.onunload = function () {
if (tabbedLanguages[currentLanguageTab]) {
localStorage.langTabPref = tabbedLanguages[currentLanguageTab]
}
}
}
} else {
bodyContent_.appendChild(bodyContent);
bodyContent = bodyContent_;
}
}
}
function hashToggleLT() {
var destination = decodeURI(location.hash.substr(1)).replace('_', ' ');
toggleLanguageTabs(destination);
}
function resetHash() {
window.scroll(0, $(location.hash).offset().top)
}
jQuery(document).ready(makeLanguageTabs);