Module:Sandbox/Smalljim/DiscussionIndexTest

--[[

20130330: I have unashamedly copied this from User:Dragons flight's DiscussionIndex module, whose comments follow:

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

]]

p = {};
pp = require( 'Module:Sandbox/Smalljim/ParsePageTest' ); --a set of page parsing functions

function p.summary( frame )
    local target = frame.args[1] or frame.args.target or ''; --the page to parse
    local exc = frame.args.excerpts or false; --opt to show an excerpt from start of each section
    if type( exc ) == 'string' then --deal with optional ways of specifying show excerpt
        exc = exc:lower();
        if exc == 'false' or exc == '' or exc == '0' or exc == 'no' then
            exc = false;
        else
            exc = true; --anything but 'false', '', '0' or 'no' (case insensitive)
        end
    end  
    local rt = ( tonumber( frame.args.recent ) or 120 )*60; --green cell if < 120 min or use "recent" to specify
    local ot = ( tonumber( frame.args.old ) or 60*24*2 )*60; --red cell if > 2 days or use "old" to specify

    if target == '' then --no target page specified
        return '';
    end
    local text = frame:preprocess( '{{:' .. target .. '}}' ); --does this expand templates in target page?

    return frame:preprocess( p._summary( text, target, exc, rt, ot ) );
end
    
function p._summary( text, target, exc, rt, ot )
    local lang = mw.getContentLanguage();
    local now = lang:formatDate( 'U' );
        
    local sections, headings = pp.getSections( text, 2 ); --2 is header level
    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 ' ..
        '([{{fullurl:{{FULLPAGENAME}}|action=purge}} update now]).\n\n' ..
        'The current version of this report is still experimental and may contain ' ..
        'significant inaccuracies.\n\n'
    
    if exc then
        result = result .. '{| class="wikitable" \n';
    else
        result = result .. '{| class="wikitable sortable" \n'; --no excerpts, so can make it sortable
    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 --drop times in the future
            if now - v[2] < 0 then
                table.remove( times, k)
            end
        end
        
        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, rt, ot ), 
                p._formatTimeDiff(max_time, rt, ot ), 
                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 exc 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 exc 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;" | <span style="font-size:90%">' ..excerpt .. '</span>' );
        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, rt, ot )
    local tv_string;
    tv_string = '<span style="display:none">' .. tostring(tv) .. '_</span>' .. mw.ustring.gsub( pp.formatDateDiff(tv), ' ', '&nbsp;' );
    if tv < rt then
        tv_string = ' style="background:#EFE" | ' .. tv_string; --green cell
    elseif tv > ot then
        tv_string = ' style="background:#FEE" | ' .. tv_string; --red cell
    end
    return tv_string;
end

return p;

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.