Материал из ЖД cправочник
Перейти к: навигация, поиск

Замечание. Возможно, после сохранения вам придётся очистить кэш своего браузера, чтобы увидеть изменения.

  • Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl-F5 или Ctrl-R (⌘-R на Mac)
  • Google Chrome: Нажмите Ctrl-Shift-R (⌘-Shift-R на Mac)
  • Internet Explorer: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl-F5
  • Opera: Выберите очистку кэша в меню Инструменты → Настройки

function WLScript(){

var whenPageLoaded = +(new Date()) - 20000 //add 20 sec just in case
var namespace, $content, mainTab, hideInterfaceCSS
var alreadySorted, alreadyAddedUnwatch, isEnhanced, mm
var inProgress = null, timeoutID = null

mm = {
sortTip:'Сортировать страницы по пространствам',
sortDone:'Изменения уже отсортированы',
unwatchTip:'Добавить (x) ссылки для вычёркивания страниц из списка наблюдения',
unwatchDone:'Для удаления страниц из списка наблюдения используйте появившиеся ссылки (x)',
onlynew:'Только новые',
onlynewTip:'Показать изменения с момента загрузки этой страницы',
expandAll:'Показать/спрятать все свёрнутые правки',
fullPage:'Спрятать/показать элементы интерфейса'
}

namespace = document.getElementById('namespace')
if (!namespace) return

$content = $('#bodyContent')
if (!$content.length){
  $content = $('#mw_content, #article').eq(0)
  if (!$content.length) $content = $(document.body) // covered all the skin but who knows...
}

//enhanced RC: make (x) appear by clicking on timestamp
isEnhanced = $content.find('ul.special').length == 0
if (isEnhanced) $content.click(toggleXLink)

//find insertion points for links:  after "days all"
var linksAt = $('#mw-watchlist-options').find('a[href*=&days=7]').next().next()
if (!linksAt.length) linksAt = $('#mw-watchlist-options').find('hr').last()
//find "Special" tab
mainTab = $('#ca-special, #ca-nstab-special').eq(0)

//"only new" link and tab
addLnk(mm.onlynew, mm.onlynewTip).mousedown(onlyNewEntries).attr('id', 'listSince')
addTab(mm.onlynew, mm.onlynewTip).mousedown(onlyNewEntries)

//"unwatch" link(s)
if (window.unwatchLinksOnLoad) addXLinks()
else addLnk('x' , mm.unwatchTip).click(addXLinks)

//"sort" link
addLnk('↑↓', mm.sortTip).click(sortWatchlist)

//"expand all" link
if ($('#mw-rc-openarrow-0').length) addLnk('±', mm.expandAll).click(expandMultipleEdits)

//"hideInterface" tab
addTab('↸',mm.fullPage).click(hideInterface).attr('href','#')
if (document.cookie.indexOf('wlmax=1') != -1) hideInterface()

function addLnk(txt, tip){
  linksAt.before(' | ')
  return $('<a href=# title="'+tip+'" style="font-style:italic">'+txt+'</a>').insertBefore(linksAt)
}
function addTab(txt, tip){
  var tab = mainTab.clone(true).removeClass('selected').attr('id','')
  tab.find('a').text(txt).attr('title', tip).attr('accesskey','')
  return tab.appendTo(mainTab.parent())
}

return



function onlyNewEntries(e) {
 var url = window.location.href.split('#')[0]
 var days = ( +(new Date()) - whenPageLoaded)/(1000 * 3600 * 24)
 e.target.href = /[?&]days=/.test(url)
  ? url.replace(/([?&]days=)[^&]*/, '$1'+days)
  : url + (url.indexOf('?') < 0 ? '?':'&') + 'days=' + days
 return true
}



function sortWatchlist(e){
 e.preventDefault()
 if (alreadySorted) return alert(mm.sortDone)
 $content.find('h4').each(function(i, H4){ //sort all days separately
   sortDay($(H4).next('div, ul'))
 })
 alreadySorted = true
}

function sortDay(dayDiv){
 var i, pgname, rowElem, hiddenDiv, rows = dayDiv.find('a[href*="&action=history"]')
 for (i = 0; i < rows.length; i++){
   pgname = getTitleFromURL(rows[i].href)
   ns = getNSFromTitle(pgname)
   if (ns>0) pgname = pgname.substring(getNamespace(ns).length+1) //title w/o prefix
   if (ns%2) ns-- //sort talk page as if it was a base page
   rows[i].sortkey = zzz(ns) + ':' + pgname //assign custom tag attribute: namespace+title
 }
 //sort rows array
 rows.sort(function(a,b){
   if (a.sortkey > b.sortkey) return 1
   else if (a.sortkey < b.sortkey) return -1
   else return 0
 })
 //sort rows in HTML, by moving all to the bottom
 if (isEnhanced)
   for (i=0; i<rows.length; i++){
     rowElem = rows.eq(i).closest('table')
     hiddenDiv = rowElem.next('div')
     dayDiv.append(rowElem, hiddenDiv)
   }
 else
   for (i=0; i<rows.length; i++){
     rowElem = rows.eq(i).closest('li')
     dayDiv.append(rowElem)
   }
}



function expandMultipleEdits(e){
 e.preventDefault()
 var i = 0, sp, state = $('#mw-rc-openarrow-0')[0].style.display
 while (sp=document.getElementById('mw-rc-openarrow-'+(i++).toString()))
   if (sp.style.display == state) $(sp.firstChild).click()
}




function addXLinks(e){
 if (e) e.preventDefault()
 if (alreadyAddedUnwatch) return alert(mm.unwatchDone)
 $content.find('a[href*="&action=history"]').each(function(i, lnk){ addXLink(lnk) })
 alreadyAddedUnwatch = true
}

function addXLink(lnk){
  var x = $('<a class=aj-unwatch style="font-size:smaller" title="'+mw.msg('unwatch')+'" />')
       .attr('href', lnk.href.replace(/&curid=\d+/,'').replace(/action=history/,'action=unwatch'))
       .click(ajaxUnwatch)
   lnk = $(lnk)
   if (isEnhanced) lnk.parent().prepend(  x.append('(x)'), ' ' )
   else lnk.after( ' | ', x.append('x') )
}

function toggleXLink(e){ //add (x) when clicking on timestamp
   if ( ! $(e.target).filter('td.mw-enhanced-rc').length ) return
   var tbl = $(e.target).parents('table.mw-enhanced-rc')
   var x = tbl.find('a.aj-unwatch')
   if (x.length) x.remove()
   else addXLink(tbl.find('a[href*="&action=history"]')[0])
}


function ajaxUnwatch(e) {
 if (inProgress) return false
 inProgress = getTitleFromURL(this.href)
 timeoutID = window.setTimeout( function() {inProgress = null},  10000 )
 //call server
 var req = { action:'watch', format:'json', title:inProgress }
 if (/&action=unwatch/.test(this.href)) req.unwatch = ''
 $.getJSON( '/w/api.php', req, showUnwatch)
 return false
}

function showUnwatch (response) {
  if (timeoutID) window.clearTimeout(timeoutID)
  response = response.watch
  var name = inProgress, state, pg
  inProgress = null
  if (response.watched !== undefined) state = false
  else if (response.unwatched !== undefined) state = true
  else return //unrecognized response
  //find the full name of "other page"
  var ns = getNSFromTitle(name)
  var name2 = name
  if (ns > 0) name2 = name2.substring(getNamespace(ns).length+1) //remove old prefix
  if (ns % 2)  ns--; else ns++ //switch to  "other" namespace
  if (ns > 0) name2 = getNamespace(ns) + ':' +  name2 //add new prefix
  //now mark all rows that are either name or name2
  $content.find('a.aj-unwatch').each(function(i, lnk){
    pg = getTitleFromURL(lnk.href)
    if (pg != name && pg != name2) return
    lnk.title = mw.msg(state?'watch':'unwatch')
	$(lnk).parent().find('a').css('text-decoration', state ? 'line-through' : '')
	lnk.href = lnk.href.replace(/&action=\w+/, '&action='+ (state?'watch':'unwatch'))
  })
}




function hideInterface(e){

 if (e) e.preventDefault()

 if (!hideInterfaceCSS)  hideInterfaceCSS = mw.util.addCSS('\
 div#siteNotice, h1#firstHeading, #siteSub, #contentSub, fieldset#mw-watchlist-options,\
 div.mw-rc-label-legend, #mw-fr-watchlist-pending-notice {display:none}')
 else hideInterfaceCSS.disabled = !hideInterfaceCSS.disabled

 document.cookie = 'wlmax=' + (!hideInterfaceCSS.disabled ? '1' : '0;expires=' + (new Date()).toGMTString() + ';;')

 var a = mainTab.find('a') //replace "Special" tab text with "Watchlist"
 if (hideInterfaceCSS.disabled){ //restore
     a.text( a.attr('oldtext') )
 }else{//set to "watchlist"
   a.attr('oldtext', a.text())
   a.text($('h1#firstHeading').text())
 }

}




//common functions; need 'namespace' select element

function getNSFromTitle(title){ //returns namespace number
 var i = title.indexOf(':')
 if (i == -1) return 0
 var prefix = title.substring(0,i+1) //including ':'
 for (i=2; i < namespace.options.length; i++)
   if (namespace.options[i].text+':' == prefix)
     return i-1
 return 0 // ':' was just a part of the title
}

function getNamespace(ns){ //returns namespace name
 if (ns==0) return ''
 else return namespace.options[ns+1].text
}

function getTitleFromURL (url){ //gets 'title=' part from a link
  var ma = url.match(/(&|\?)title=([^&]+)/)
  if (ma) return decodeURIComponent(ma[2]).replace(/_/g,' ')
  else return ''
}

function zzz(s){ // 5 -> 005
 s = s.toString()
 if (s.length==1) return '00'+s
 else if (s.length==2) return '0'+s
 else return s
}


}


if (wgCanonicalSpecialPageName == 'Watchlist' && wgAction == 'view') WLScript()