Участник:Alex Smotrov/RSS.js

Материал из Викиновостей, свободного источника новостей

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

  • Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl+F5 или Ctrl+R (⌘+R на Mac)
  • Google Chrome: Нажмите Ctrl+Shift+R (⌘+Shift+R на Mac)
  • Internet Explorer / Edge: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl+F5
  • Opera: Нажмите Ctrl+F5.
var articlePath = mw.config.get('wgServer') + mw.config.get('wgArticlePath').replace('$1','')



var outputPage = 'Викиновости:RSS-поток'
var outputFind = /<lastBuildDate>.*<\/lastBuildDate>/
var outputFormat = '\
<lastBuildDate>$lastBuildDate</lastBuildDate>\n\n\
<item>\n\
<title>$title</title>\n\
<link>$link</link>\n\
<description>$description</description>\n\
<pubDate>$pubDate</pubDate>\n\
<enclosure url="$url" length="$length" type="$type" />\n\
<comments>$comments</comments>\n\
</item>\n'

var pageText = ''










function showForm(){

    appendCSS('#inputForm table,  #inputForm table input, #inputForm table textarea {width:99%}\
    div#data {margin-top:1em; border:1px solid gray}')

    var formStructure = {
     title: wgTitle,
     link:  articlePath + wgPageName + '?curid='+wgArticleId,
     description: '<textarea name=description rows=6>'+ $('#bodyContent p').slice(1,4).text()+'</textarea>',
     pubDate: Date(),
     lastBuildDate: Date(),
     comments: articlePath + 'Комментарии:' + wgPageName,
     enclosure:'<hr>',
     url:'<textarea name=url rows=4></textarea>',
     length:'',
     type:''
    } 

    var tableHTML = '<form id=inputForm><table><col width=10% /><col />'
    for (k in formStructure){
      var el = formStructure[k]
      if (el.indexOf('<') != 0) el = '<input name="'+k+'" value="'+el+'">'
      tableHTML += '<tr><td>' + k + '</td><td>' + el + '</td></tr>'
    }
    tableHTML += '</table><input type=submit value=Go><div id=data /></form>'
    
    
    $('#inputForm').remove()
    $('#contentSub, #siteSub').eq(0).after(tableHTML)
    $('#inputForm').submit(submitForm)

    //enclosure    
     var frm = $('#inputForm')[0]
     var src = $('#bodyContent img.thumbimage ').eq(0).attr('src')
     if (src){
        frm.url.value = src
        var ext = src.match(/\.([a-z][a-z][a-z])$/)
        if (ext.length) frm.type.value = 'image/'+ext[1]
    }
    
}




function submitForm(e){
  e.preventDefault()
  var txt = processForm().replace(/</g,'&lt;').replace(/>/g,'&gt;')
  //.replace(/&lt;\/?\w+&gt;/g, '<code>$&</code>')
  //.replace(/\n/g,'<br>')

  // pageText = pageText.replace(outputFind, output)

  $('#data').html('<textarea rows=10>'+txt+'</textarea>')
}


function processForm(){
  var frm = $('#inputForm')[0]
  return outputFormat.replace(/\$(\w+)/g, function(s, nm){  return frm[nm].value })
}




function startNewForm(){
  showForm()
  //getOutputPage()
}

//if (wgNamespaceNumber == 2) 
$(function(){
 $(addPortletLink('p-tb','#','-> RSS')).click(startNewForm)
})


function getOutputPage(){
  apiQuery({prop:'info|revisions', titles:outputPage, intoken:'edit', 
   rvprop:'timestamp|user|comment|content'},
   recvOutputPage)
}


function recvOutputPage(resp){
 //var 
 zz = resp
 pg = getAnyChild(resp.query.pages)
 editToken = pg.edittoken
 pageText = pg.revisions[0]['*']
 $('#data').append(pageText)
 
}


function getAnyChildKey(obj) { for(var key in obj) return key; return null }
function getAnyChild(obj) { var key = getAnyChildKey(obj); return key ? obj[key] : null }


function savePage(){
  apiPost(
   {
   action:'edit', 
   nocreate: true,
   title:outputPage,
   summary: '+ [['+wgTitle+']]',
   text: pageText,
   basetimestamp: baseTimeStamp, //=20070824123454
   token:editToken
   },
  saveResponse
 )
}


function saveResponse(resp){
}



function apiQuery(data, func){
 data.format = 'json'
 if (!data.action) data.action = 'query'
 $.get(wgScriptPath+'/api.php', data, func)
}

function apiPost(data, func){
 $.post(wgScriptPath+'/api.php', data, func)
}











/**/





// small API library
 
//initialization
var serverTime = ''
var $debug = getURLParamValue('debug')
 
$(function(){
 $().ajaxSuccess( function(e, aj){ //get server time from other requests
   serverTime = parseServerTime(aj.getResponseHeader('Date')) 
 })
 $.ajaxSetup({ cache:false })
})
 
 
 
function api(data, callback){
 if (typeof data=='object') data = $.param(data)
 var url = wgScriptPath+'/api.php?action=query&'+data
 //display request URL
 if (window.$debug) dispMsg($('<a>').text(/&(list|prop)=(\w+)/.exec(url)[2])
 .css('margin-right','1em').attr('href',url))
 //request
 $.getJSON(url+'&format=json', function(d,s){
   if (d.error) dispMsg('API error: '+d.error.code+': '+d.error.info, true)
   if (d.warnings) dispMsg('API warning: '+dumpJSON(d.warnings).replace(/\n/g,'<br>'), true)
   callback(d,s)
 })
}
 
function dispMsg(htm, isErr){ //div#messages should exist
 if (isErr) htm = '<p class=error>'+htm+'</p>'
 $('#messages').append(htm,'<br />').show()
} 
 
function dumpJSON(o){
 var s = ''
 for (var k in o)
   if (typeof o[k] == 'object') return k+':'+dumpJSON(o[k])
   else s+=o[k]+'\n'
 return s  
}
 
function checkbox(name, text, attr){
 return '<input type=checkbox name='+name+' id='+name +
   (attr?' '+attr:'')+'><label for='+name+'>'+text+'</label>'
}
 
function getURLParamValue(name){
 var m = RegExp('[&?]'+name+'=([^&#]*)').exec(document.URL)
 if (m && m.length > 1) return decodeURIComponent(m[1])
 return null
}
 
 
 
 
 
 
function UrlToForm(obj){ //autofill form from URL
 obj = $(obj)
 var val
 obj.find('input').add(obj.find('select')).each(function(t,el){
   val = getURLParamValue(el.name)
   if (val==null) return
   switch (el.type){
    case 'radio': 
      obj.find('input [type=radio][value="'+val+'"]').attr('selected',true)
      break
    case 'checkbox': 
      if (el.value==val || val=='on') if (!el.checked) el.click()
      else if (val==''  || val=='off') if (el.checked) el.click()
      else el.value = val
      break
    default: //text, select
     el.value = val.replace(/_/g,' ')
   }
 })
}
 
 
function formToUrl(obj){
 obj = $(obj)
 var url = '&'+obj.serialize().replace(/\+/g,'_')
 obj.find('input:checkbox:not(:checked)').each( function(t,el){ 
     url += '&' + el.name + '=' //also "remember" unchecked checkboxes
 })
 return url
}
 
 
function displayHelp(e){
 if (!e) //called from Script just to add help link to #dialog
   $(outputIcon('/4/44/Help-browser.svg', 25,
    'alt=help style="cursor:pointer;float:right"'))
   .click(displayHelp).appendTo('#dialog')
 else if ($('#help').length !=0) 
   $('#help').remove()
 else {
  var url = wgArticlePath.replace(/\$1/,'') + wgPageName +
   '?run='+script.name + formToUrl('#dialog')
  var hlp = $('<div id=help style="position:absolute;top:30px; right:70px;\
   border:2px outset gray; background:white; padding:1em"><div id=page /><br><hr>\
   Подробнее см. ' + outputPageLink(script.page) + '<br><hr>\
   Ссылка на скрипт с текущими параметрами: <a href="'+url+'">'+script.name+'</a>')
   .appendTo(document.body).click(function(){$(this).remove()})
   loadTemplate('#page', script.page)
 }
} 
 
function loadTemplate(sel, page){ 
 $.get(wgScriptPath+'/api.php?action=parse&format=xml&prop=text&text={\{'
  +encodeURIComponent(page)+'}}', function(data){
    $(sel).html($(data).find('text').text())
 })
 // http://ru.wikipedia.org/w/api.php?action=parse&text={{user%20talk:Alex%20Smotrov}}&prop=text
}
 
 
function parseServerTime(ts){ //"Tue, 29 Jan 2008 22:32:21 GMT" -> date
 if (!ts) return null
 var m = ts.match(/(\d\d?) ([A-Z][a-z][a-z]) (\d\d\d\d) (\d\d):(\d\d):(\d\d)/)
 if (m){
   var d = new Date(); d.setYear(m[3]); d.setDate(m[1]); 
   d.setMonth('janfebmaraprmayjunjulaugsepoctnovdec'.indexOf(m[2].toLowerCase()) / 3)
   d.setHours(m[4]); d.setMinutes(m[5]); d.setSeconds(m[6])
 }else
   var d = new Date(ts.substring(0, ts.length-4)) //cut "GMT" part
 return d
}
 
function parseTimestamp(ts){ //20071226220605  or  2008-01-26T06:34:19Z   -> date
 if (!ts) return null
 ts = ts.replace(/\D/g,'')
 var d = new Date()
 d.setYear(ts.substring(0,4))
 d.setMonth(ts.substring(4,6)-1)
 d.setDate(ts.substring(6,8))
 d.setHours(ts.substring(8,10))
 d.setMinutes(ts.substring(10,12))
 d.setSeconds(ts.substring(12,14))
 return d
}
 
function outputPeriodInHours(mlsec){ //milliseconds -> "2:30" or 5,06 or 21
 var mm = Math.floor(mlsec/60000)
 var hh = Math.floor(mm/60); mm = mm % 60
 var dd = Math.floor(hh/24); hh = hh % 24
 if (dd) return dd + (dd<10?'<small>,'+pad0(hh,2)+'</small>':'')
 else return '<small>'+hh + ':' + pad0(mm,2)+'</small>'
}
 
 
function outputIntLink(link, name, attr){
 return '<a href="' + wgScript + '?' + link + '" '+ (attr||'') + '>'+name+'</a>'
}
 
function outputPageLink(page, name){
 name = name || page
 if (window.maxTitleLength && name.length > maxTitleLength) 
   name = name.substring(0,maxTitleLength)+'…'
 return '<a href="' + wgArticlePath.replace(/\$1/,'') 
 + encodeURI(page).replace(/\?/g,'%3F').replace(/%20/g,'_') 
 + '" title="'+page.replace(/"/g,'&quot;')+'">' + name + '</a>'
 //encodeURIComponent(page).replace(/%2F/g,'/')
}
 
function outputUserLink(user){
 return outputPageLink('Special:Contributions/'+user, user)
}
 
function outputDiffClass(n){
 return 'mw-plusminus-'+ (n>0 ? 'pos' : (n<0?'neg':'null'))
}
 
function outputIcon(src, size, attr){ //returns "<img ...>"
 if (size) src = 'thumb/'+src+'/'+size+'px-'+src.split('/')[2]+'.png' //for svg
 return '<img src="http://upload.wikimedia.org/wikipedia/commons/'
 + src + '" ' + (attr||'')+'>'
}
 
function pad0(v, len){ v = v.toString();  while (v.length < len) v = '0'+v; return v } // 6 -> '06'
 
 
var toggleCSSObj = {}
function toggleCSS(css, isDisabled){
 if (!toggleCSSObj[css]) toggleCSSObj[css] = addCSS(css)
 toggleCSSObj[css].disabled = isDisabled
}
 
 
function addCSS(c){ var s = appendCSS(c); return s.sheet || s } // Safari compat
 
 
function spinner2(sel){
 if (!sel) $('img.spinner').remove()
 else $(sel).append('<img class=spinner style="margin-left:1em" src="'+stylepath
  +'/common/images/spinner.gif" alt="..." title="..." />')
}

/**/