Module:DiscussionIndex

--[[

This module provides a formatted index of the discussions that have occured on a target page.

]]

p = {}; pp = require( 'Module:ParsePage' );

function p.summary( frame ) local target = frame.args[1] or frame.args.target or ''; local use_excerpts = frame.args.excerpts or false; if type( use_excerpts ) == 'string' then use_excerpts = use_excerpts:lower; if use_excerpts == 'false' or use_excerpts == '' or               use_excerpts == '0' or use_excerpts == 'no' then use_excerpts = false; else use_excerpts = true; end end local recent_time = ( tonumber( frame.args.recent_time ) or 120 )*60; local old_time = ( tonumber( frame.args.old_time ) or 60*24*2 )*60;

if target == '' then return ''; end local text = frame:preprocess( '' );

return frame:preprocess( p._summary( text, target, use_excerpts, recent_time, old_time ) ); end function p._summary( text, target, use_excerpts, recent_time, old_time ) local lang = mw.getContentLanguage; local now = lang:formatDate( 'U' ); local sections, headings = pp.getSections( text, 2 ); local result; result = '== Discussion summary report for ' .. target .. ' ==\n\n' result = result .. 'This is an automated summary of the discussions occurring on ' .. target .. '.\n\n' .. 'It was last generated at ' .. lang:formatDate( 'l, j F Y, H:i:s' ) .. ' UTC ' .. '([ update now]).\n\n' .. 'The current version of this report is still experimental and may contain ' .. 'significant inaccuracies.\n\n' if use_excerpts then result = result .. '{| class="wikitable" \n'; else result = result .. '{| class="wikitable sortable" \n'; end result = result .. '! Section title !! data-sort-type="number" | Age ' .. ' !! data-sort-type="number" | ' .. ' Last Comment !! Bytes !! Originator !! data-sort-type="number" | Other Participants \n|-\n|'; local result_lines = {}; for k, tt in ipairs( sections ) do       local users = pp.getUsers( tt, false, true ); local times = pp.getTimestamps( tt ); local min_time, max_time local min_time_string, max_time_string local line_item = {}; for k, v in ipairs( times ) do           if min_time == nil or min_time > v[2] then min_time = v[2]; end if max_time == nil or max_time < v[2] then max_time = v[2]; end end for k, v in ipairs( times ) do           if min_time == v[2] then min_time_string = v[1]; end if max_time == v[2] then max_time_string = v[1]; end end min_time = now - (min_time or now); max_time = now - (max_time or now);

local user_list = {} for _, tt in pairs( users ) do           table.insert( user_list, tt[2] ); end if headings[k] ~= '' and user_list[1] ~= nil then line_item = { pp.formatSectionLink( target, headings[k] ), p._formatTimeDiff(min_time, recent_time, old_time ), p._formatTimeDiff(max_time, recent_time, old_time ), tostring( #tt ), user_list[1] };

table.remove( user_list, 1 ); table.sort( user_list ); table.insert( line_item, tostring( #user_list ) .. ': ' .. table.concat( user_list, ', ' ) ) if use_excerpts then table.insert( line_item, pp.getExcerpt( tt, 500 ) ) end table.insert( result_lines, line_item ); end end

comp = function( a, b ) local a2, b2       a2 = mw.ustring.gsub( a[3], '%b<>', '' ); a2 = mw.ustring.gsub( a2, '.*|%s*', '' ); b2 = mw.ustring.gsub( b[3], '%b<>', '' ); b2 = mw.ustring.gsub( b2, '.*|%s*', '' ); a2 = tonumber( mw.ustring.match( a2, '^(%d-)_' ) ) or 0; b2 = tonumber( mw.ustring.match( b2, '^(%d-)_' ) ) or 0; return a2 < b2; end table.sort( result_lines, comp );

local result_lines2 = {}; local row; for k, tt in ipairs( result_lines ) do       if use_excerpts then local excerpt = tt[#tt]; table.remove( tt ); row = table.concat( tt, '||' ); table.insert( result_lines2, row ); table.insert( result_lines2,                ' colspan=6 style="padding-left:2em; padding-top:0.5em; padding-bottom:0.5em;" | ' ..excerpt .. ' ' ); else row = table.concat( tt, '||' ); table.insert( result_lines2, row ); end end

result = result .. table.concat( result_lines2, '\n|-\n|' ) .. "\n|}"; return result; end

function p._formatTimeDiff( tv, recent_time, old_time ) local tv_string; tv_string = ' ' .. tostring(tv) .. '_ ' .. mw.ustring.gsub( pp.formatDateDiff(tv), ' ', ' ' ); if tv < recent_time then tv_string = ' style="background:#EFE" | ' .. tv_string; elseif tv > old_time then tv_string = ' style="background:#FEE" | ' .. tv_string; end return tv_string; end

return p;