User:Gary/enhanced random article.coffee
ENHANCED RANDOM ARTICLE
Documentation: Wikipedia:Enhanced Random Article
Description: Enhances the existing "Random article" feature.
Disambiguation pages, redirects, and pages with titles that match a certain pattern can be skipped over.
TODO
- Match patterns to NOT show.
enhancedRandomArticle = {} unless enhancedRandomArticle?
if typeof(unsafeWindow) isnt 'undefined'
addPortletLink = unsafeWindow.addPortletLink
mw = unsafeWindow.mw
enhancedRandomArticleBegin = ->
###
DEFAULT SETTINGS
enhancedRandomArticle = { patterns: [], showDisambiguationPages: false, showStubs: false }
enhancedRandomArticle = {}
enhancedRandomArticle.patterns = []
enhancedRandomArticle.showDisambiguationPages = false
enhancedRandomArticle.showStubs = false
###
enhancedRandomArticle = {} unless enhancedRandomArticle?
enhancedRandomArticle.patterns = [] unless enhancedRandomArticle.patterns?
enhancedRandomArticle.showDisambiguationPages = false unless enhancedRandomArticle.showDisambiguationPages?
enhancedRandomArticle.showStubs = false unless enhancedRandomArticle.showStubs?
$.get(mw.config.get('wgScriptPath') + '/api.php', { action: 'query', list: 'random', rnnamespace: 0, format: 'json', rnlimit: 10 }, eRCreateArticleList)
eRCreateArticleList = (obj) ->
articles = obj.query.random
articlesArray = []
for article in articles
articlesArray.push(article.title)
$.get(mw.config.get('wgScriptPath') + '/api.php', { action: 'query', prop: 'revisions', rvdir: 'older', rvprop: 'content', titles: articlesArray.join('|'), format: 'json' }, eRCheckMatches)
matchDisambig = (possiblePatterns, content) ->
for pattern in possiblePatterns
matchExpr = new RegExp(pattern, 'i')
if content.match(matchExpr)
return true
false
checkRandomMatch = (userSettings, title, content) ->
eRA = userSettings
disambiguationMatches = ['disambig}}', 'dis}}', 'disambiguation}}', 'surname}}'] # Primary, and secondary
matched = false # TRUE indicates we found an article we want
matchedPattern = ''
for pattern in eRA.patterns
# Found a pattern in an article's title
if (title.match(pattern))
matched = true
matchedPattern = pattern
break
# User wants disambig and stubs, has no patterns
if not eRA.patterns.length and eRA.showDisambiguationPages and eRA.showStubs
console.log(1)
matched = true
# User doesn't want disambig, gets disambig
if matched and not eRA.showDisambiguationPages and matchDisambig(disambiguationMatches, content)
matched = false
else if not eRA.patterns.length and not eRA.showDisambiguationPages and not matchDisambig(disambiguationMatches, content)
console.log(2)
matched = true
# User doesn't want stubs, gets stub
if matched and not eRA.showStubs and content.match(/stub}}/i)
matched = false
else if not eRA.patterns.length and not eRA.showStubs and not content.match(/stub}}/i)
console.log(3)
matched = true
matched
eRCheckMatches = (obj) ->
articles = []
for page, value of obj.query.pages
articles.push(value)
# match patterns
eRA = enhancedRandomArticle
if typeof(eRA.patterns) is 'string'
eRA.patterns = [eRA.patterns]
for article in articles
content = article['revisions'][0]['*']
title = article['title']
matched = checkRandomMatch(eRA, title, content)
if matched
window.location = '/wiki/' + title
return
alert("ENHANCED RANDOM ARTICLES\n\nAn article that meets all of your criteria could not be found. Please try again.\nAlso, perhaps consider using less restrictive criteria.\n\nKeep in mind that only 10 articles are retrieved each time this script is activated,\nso there's a good chance that most of them won't match your criteria if it's too strict.")
addEnhancedRandomArticlePortletLink = ->
if $('#p-navigation').length
mw.util.addPortletLink('p-navigation', '#', 'Enhanced random', 't-enhanced-random-article', 'Show a random article, with enhanced settings', '', '#n-randompage')
$('#t-enhanced-random-article').on('click', (event) ->
event.preventDefault()
enhancedRandomArticleBegin()
)
# access key
if $('#n-randompage').length
randomPageLink = $('#n-randompage').children().eq(0)
randomPageLink.attr('accesskey', null)
node = $('#t-enhanced-random-article')
nodeLink = node.children().eq(0)
nodeLink.attr('accesskey', 'x')
nodeLink.attr('title', nodeLink.attr('title') + ' [ctrl-x]')
$(addEnhancedRandomArticlePortletLink)
if typeof(unsafeWindow) isnt 'undefined'
unsafeWindow.checkRandomMatch = checkRandomMatch
unsafeWindow.enhancedRandomArticle = enhancedRandomArticle
unsafeWindow.enhancedRandomArticleBegin = enhancedRandomArticleBegin
unsafeWindow.eRCheckMatches = eRCheckMatches
unsafeWindow.eRCreateArticleList = eRCreateArticleList
unsafeWindow.matchDisambig = matchDisambig