Module:User:SuggestBot/WikiProjects

local wp = {}

-- BTW: Lua allows literal strings declarations [[ ]], but the syntax
-- highlighter doesn't support them properly, fails if the string contains
-- another set of square brackets...

-- Number of articles in each list if the page invoking this module is transcluded
local inc_limit = 2

-- Mapping of article assessment ratings to low/medium/high as numbers
local rating_numbers = {FA=3, A=3, GA=3, B=2, C=2, Start=1, Stub=1, NA=0}
local rating_names = {FA='High', A='High', GA='High', B='Medium', C='Medium',
	Start='Low', Stub='Low', NA='Unassessed'}

-- Mapping of SuggestBot's task categories (see [[User:SuggestBot/Documentation/Task categories]])
-- to section titles and descriptions, and the order in which they will be presented
local taskcat_order = {'source', 'cleanup', 'expand', 'unenc',
	'merge', 'wikify', 'orphan', 'stub'}
local taskcat_map = {
	source={
		title='Add sources',
		descr='See [[Wikipedia:Citing sources]] for more information.'
	},
	cleanup={
		title='Cleanup',
		descr='Improve the presentation of content.'
	},
	expand={
		title='Expand',
		descr='Add more information to these articles.'
	},
	unenc={
		title='Unencyclopaedic',
		descr='Remove content that is not relevant for an encyclopaedia.'
	},
	merge={
		title='Merge',
		descr='Should this article be merged with another article?'
	},
	wikify={
		title='Wikify',
		descr='Improve the wiki-formatting on this article.'
	},
	orphan={
		title='Orphan',
		descr='Few or no articles link to this article.'
	},
	stub={
		title='Stub',
		descr='Expand on this brief article.'
	}
}

-- Mapping of needs (specific tasks to improve an article) to descriptions
local needs_list = {'content', 'headings', 'links', 'images', 'sources'}
local needs_map = {content='more content',
	headings='proper section headings',
	links='more wikilinks',
	images='more images',
	sources='more sources'}

-- Local support functions follow below

local function has_key(tbl, key)
	-- Check if the given table has the given key
	return tbl[key] ~= nil	
end

local function sort_articles(arglist, task_cats)
	-- Sort the given argument list into a table mapping task categories
	-- to a list of articles in that task category.
	local sorted_arts = {}
	for i, task_cat in pairs(task_cats) do
		sorted_arts[task_cat] = {}
	end

	-- 0-based index of the current article being processed	
	local cur_art = 0
	while arglist[(cur_art * 6) + 1] do
		local cur_idx = cur_art * 6
		local task_cat = arglist[cur_idx + 1]
		-- Do we have this task category in our table?
		if sorted_arts[task_cat] then
			table.insert(sorted_arts[task_cat], {
				tag=task_cat, title=arglist[cur_idx + 2],
				views=arglist[cur_idx + 3],
				cur_qual=arglist[cur_idx + 4],
				pred_qual=arglist[cur_idx + 5],
				tasks=arglist[cur_idx + 6]
				})
		end
		cur_art = cur_art + 1
	end
	return sorted_arts
end

local function randomizeArray(t, limit)
	-- Randomizes an array. It works by iterating through the list backwards, each time swapping the entry
	-- "i" with a random entry. Courtesy of Xinhuan at http://forums.wowace.com/showthread.php?p=279756
	-- If the limit parameter is set, the array is shortened to that many elements after being randomized.
	-- The lowest possible value is 0, and the highest possible is the length of the array.
	local len = #t
	for i = len, 2, -1 do
		local r = math.random(i)
		t[i], t[r] = t[r], t[i]
	end
	if limit and limit < len then
		local ret = {}
		for i, v in ipairs(t) do
			if i > limit then
				break
			end
			ret[i] = v
		end
		return ret
	else
		return t
	end
end

local function make_ratingdesc(assessment, prediction)
	-- Make a string that describes the article's quality
	-- Quality: Low, Assessed class: Stub, Predicted class: Stub
	return "Quality: " .. rating_names[prediction] ..
	", Assessed class: " .. assessment ..
	", Predicted class: " .. prediction
end

local function make_needs(needs)
	-- From the given comma-separated list of needs, make a string that
	-- describes those needs based on needs_map
	local result = ''
	for i, task in ipairs(needs_list) do
		if string.find(needs, task) then
			result = result .. ", " .. needs_map[task]
		end
	end
	-- Remove the first two characters (", ")
	result = mw.ustring.sub(result, 3)
	-- Return with the first character in upper-case, from http://lua-users.org/wiki/StringRecipes
	return result:gsub("^%l", string.upper)
end

-- Globally exposed functions follow below
function wp.suggestions(frame)
	-- Process the suggested articles given in the frame's arguments
	-- and build lists of articles for each task category defined in the global
	-- list of categories above.
	
	-- Keyword arguments: 
	-- * is_included=yes: passed in to limit lists to two items each when
	--                    the page of the call is transcluded
	-- * list_col=[colour value]: defines the CSS colour value of list headers
	-- * item_col=[colour value]: defines the CSS colour value of list items
	--
	-- The rest of the arguments are sets of six parameters describing each
	-- suggested article, as follows:
	-- 1: task category
	-- 2: article title
	-- 3: number of average views/day (14 days prior to the update)
	-- 4: assessed quality
	-- 5: predicted quality
	-- 6: comma-separated list of specific tasks for improving this article
	
	local list_col = '#086'
	local item_col = '#37f'
	if has_key(frame, 'list_col') then
		list_col = frame['list_col']
	end
	if has_key(frame, 'item_col') then
		item_col = frame['item_col']
	end
	
	local is_included = false
	if has_key(frame.args, 'is_included') then
		is_included = true
	end
	
	-- When was the page this is invoked from last updated?
	local last_update = frame:expandTemplate{title='WPX last updated',
		args={frame:getParent():getTitle()}}
	
	local result = ''
	
	-- sort the supplied suggested articles and process into lists…
	local sorted_articles = sort_articles(frame.args, taskcat_order)
	for i, task_cat in pairs(taskcat_order) do
		-- write list start
		local list_params = {color=list_col,
			title=taskcat_map[task_cat]['title'],
			intro=taskcat_map[task_cat]['descr'] .. "<br />" .. last_update
		}
		if is_included then
			list_params['constrained'] = 'yes'
		end
		result = result .. frame:expandTemplate{title='WPX list start',
								args=list_params}
		
		-- write some articles
		local articles = sorted_articles[task_cat]
		if is_included then
			articles = randomizeArray(articles, inc_limit)
		end
		
		for j, article in pairs(articles) do
			result = result .. frame:expandTemplate{title='WPX article recommendation',
				args={
					color=item_col,
					title=article['title'],
					pageviews=article['views'],
					rating=rating_numbers[article['pred_qual']],
					rating_description=make_ratingdesc(article['cur_qual'],
						article['pred_qual']),
					needs=make_needs(article['tasks'])
				}
			}
		end
		
		-- write list end
		result = result .. frame:expandTemplate{title='WPX list end',
			args={more=frame:getParent():getTitle(), section=string.gsub(taskcat_map[task_cat]['title'], ' ', '_')}}
	end
	return result
end

function wp.hello(frame)
	return "Hello World!"	
end

function wp.test_args(frame)
	result = "The method got the following arguments:"
	if has_key(frame, 'is_included') then
		result = result .. "\n* is_included" .. frame.args['is_included']
	end
	for k, v in pairs(frame.args) do
		result = result .. "\n* " .. k .. "=" .. v				
	end
	return result
end

return wp

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.