Module:RDIndex
This module is responsible for making the Lua-based archive pages for the Refdesk at WP:Reference desk/Archives/Lua.
Usage
For all the recent archives like WP:Reference desk/Archives/Lua/Science/January 2013, it extracts the month, year, and desk from the title string if they are not otherwise specified. (The exact order doesn't matter; it does a text search) Therefore, these pages contain simply:
{{#invoke:RDIndex|month}}
However, conventional parameter-based settings are available to override the defaults thus obtained - however, these haven't been tested much and may need debugging.
Parameters
- cat = a specific category (as provided by the Template:Rdcat pseudo-template) can be specified here, in which case only the pages from that category will be indexed. Or it can be set to "no" and this column is omitted.
- input = a text for the "main" function (not "month") to process
- desk = (Science, Humanities, etc.)
- label = (an arbitrary replacement for the desk to be shown in the table, if provided)
- date = (the date to be shown, if not obtained from the page name)
- arcpage = (the page where the original discussion is archived)
The Rdcat pseudo-template
Template:Rdcat doesn't do anything, because the text is read in by the module without template substitution - this module simply looks for {{Rdcat|xxx|xxx}} and processes it on its own. The first parameter sets a category for display in the table; the second is reserved for a subcategory system within a system.
Categories are things like "biology", "chemistry", "astronomy", "physics", "engineering" under Science. The subcategories would be more specific topics, perhaps evolution, DNA, protein, taxonomy, virology, etc. under Biology. To make the categories and subcategories work it is well-nigh essential to recruit people interested in sorting the questions, and for them to do so pretty consistently.
local p={} -- ultimate planned purpose is to create table rows of Refdesk questions, type, date, answerer including wikilinks in collaboration with a big template
function p.main(frame,input,label,desk,year,month,day,arcpage)
local args=frame.args
local parent=frame:getParent() or {}
local pargs=parent.args or {}
input=input or args.input or pargs.input
desk=desk or args.desk or pargs.desk
local label=label or args.label or pargs.label
if not label then label=desk or "unlabelled" end
local date=args.date or pargs.date or "undated"
if year and month and day then date="20"..year..": "..month.." "..day end
arcpage=arcpage or args.arcpage or pargs.arcpage or nil
local cat=args.cat or pargs.cat or "yes"
if cat=="no" then cat = nil end
local output="[[Module:RDIndex]] error: no section headings found"
local cursor, next_cursor, questioner, users, user_table, last_user;
local input_length = mw.ustring.len( input );
local breakpoints = {};
local cut, item
for cut, item in mw.ustring.gmatch( input, "\n()==+(.-)==+%s+" ) do
table.insert( breakpoints, cut );
table.insert( breakpoints, item );
end
index = 1;
output = '';
repeat
cursor = tonumber( breakpoints[index] );
title = breakpoints[index + 1];
if cursor == nil then
break;
end
next_cursor = tonumber( breakpoints[index+2] ) or input_length;
text = mw.ustring.sub(input,cursor,next_cursor-1)
tt = mw.ustring.match(title,"[=%s]+(.-)[=%s]+$")
if tt then
title=tt
else
tt = mw.ustring.match(title,"UNIQ.-QINU.(.+)")
if tt then
title=tt
end
end
local tcat=""
if cat then tcat = (mw.ustring.match(text,"{{[Rr][Dd]cat%s*|%s*(.-)}}") or "—") end
tcat=mw.ustring.match(tcat,"^(^|*)|.*$") or tcat
text = mw.ustring.gsub(text, "%[%[Special:Contributions/", "[[User:")
questioner = mw.ustring.gsub(mw.ustring.match(text,"%[%[User:(.-)[|%]]") or "","_"," ")
user_table = {}
for tt in mw.ustring.gmatch(text,"%[%[User:(.-)[|%]]" ) do
tt = mw.ustring.gsub(tt,"_"," ")
table.insert( user_table, tt );
end
table.sort( user_table );
last_user = ''
users = '';
for index, tt in pairs( user_table ) do
if tt ~= last_user and tt ~= questioner then
users = table.concat( {users, "[[User:", tt, "|", tt, "]]", " "} );
end
last_user = tt;
end
users = "[[User:" .. questioner .. "|" .. questioner .. "]]" .. " " .. users
title = mw.ustring.gsub( title, '%[%[.-|(.-)%]%]', '%1' );
title = mw.ustring.gsub( title, '%[', '' );
title = mw.ustring.gsub( title, '%]', '' );
title = mw.ustring.gsub( title, '%b<>', '' );
if arcpage then
title= table.concat( {"[[", arcpage, "#", (title or ""), "|", title, "]]"} );
else
title= title or ""
end
if (cat=="yes" or cat==tcat) then output = table.concat( {output, "\n|-\n|", title, "\n|", next_cursor-cursor, "\n|", label, "\n|", tcat, "\n|", date, "\n|", users} ) end
index = index + 2;
until next_cursor == input_length
return output
end
function p.month(frame)
local args=frame.args
local parent=frame:getParent() or {}
local pargs=parent.args or {}
local title
if not input then title=mw.title.getCurrentTitle() end
local year=args.year or pargs.year
local month=args.month or pargs.month
local desk=args.desk or pargs.desk
local label=args.label or pargs.label or desk
local nowiki=args.nowiki or pargs.nowiki
local desks={'Computing','Science','Mathematics','Humanities','Language','Entertainment','Miscellaneous'}
local months={'January','February','March','April','May','June','July','August','September','October','November','December'}
local days=31
local output=""
if not (desk and year and month) then -- I want to be able to plop this template empty of parameters into an archive page, even if it moves, as long as its name contains the data!
local title=mw.title.getCurrentTitle()
local page=title.fullText
if not desk then
for x=1,#desks do
if mw.ustring.match(page,desks[x]) then desk=desks[x]; break end
end
end
year=year or mw.ustring.match(page,"20(%d%d)") -- This has a Y2.1k bug. Pity.
if not month then
for x=1,12 do
if mw.ustring.match(page,months[x]) then month=months[x]; break end
end
end
end
year=tonumber(year)
if month=='September' or month=='April' or month=='June' or month=='November' then days=30 end
if month=='February' then
days=28
if year/4==math.floor(year/4) then days=29 end
end
for day=1,days do
page='Wikipedia:Reference desk/Archives/'..desk..'/20'..year..' '..month..' '..day
title=mw.title.new(page)
if title then
local input=title.getContent(title)
if input then output=output..p.main(frame,input,label,desk,year,month,day,page) end
end
end
output='{| class="wikitable sortable"\n!question\n!length\n!RefDesk\n!Category\n!Date\n!Editors'..output..'\n|}'
if nowiki then
return frame:preprocess("<pre><nowiki>"..output.."</nowiki></pre>")
else
return output
end
end
return p