Участник: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,'<').replace(/>/g,'>')
//.replace(/<\/?\w+>/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,'"')+'">' + 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="..." />')
}
/**/