Module:Dotted TOC page listing

From Wikisource
Jump to navigation Jump to search
--[[
  Warning: This must be considered a draft version for discussion and improvement.
           It is certainly currently not suitable for serious use.
           Please consider amending this note if/when improvements are made.
]]

p = {};
 
--[[
dtpl
 
Main entry point for Lua function to emulate existing {{dotted TOC page listing}} template.
 
Usage:
 
  {{#invoke:dotted TOC page listing|dtpl|
    chaptertext={{{chaptertext|{{{1|}}}}}}|
    entrytext={{{entrytext|{{{2|Entry text}}}}}}|
    pagetext={{{3|{{{pagetext|{{DJVU page link|{{{djvupage|1}}}|{{{djvupageoffset|0}}}}}}}}}}}|
    spaces={{{spaces|{{{4|1}}}}}}|
    chapterwidth={{{chapter-width|2.5em}}}|
    chapteralign={{{chapter-align|right}}}|
    col3align={{{col3-align|right}}}|
    col3width={{{col3-width|2em}}}|
    col4text={{{col4text|}}}|
    col4align={{{col4-align|right}}}|
    col4width={{{col4-width|2em}}}|
    col4text={{{col4text|}}}|
    dottext={{{dottext|}}}|
    entrywidth={{{entry-width|80%}}}|
    entryalign={{{entry-align|left}}}|
    hi={{{hi|1em}}}|
    symbol={{{symbol|.}}}}}

  - is functionally equivalent to (but less efficient than):
  
  {{dotted TOC page listing|
    chaptertext=                        (or unnamed parameter 1)
    entrytext=                          (or unnamed parameter 2)
    pagetext=                           (or unnamed parameter 3, or use of djvupage/djvupageoffset parameters)
    spaces=                             (or unnamed parameter 4)
    chapterwidth=
    chapteralign=
    col3align=
    col3width=
    col4text=
    col4align=
    col4width=
    col4text=
    dottext=
    entrywidth=
    entryalign=
    hi=
    symbol=}}
    
  An additional parameter (typically |debug=yes) may be used in this version to produce various internal working state displays.
  It should probably be removed at once (as it has already served its purpose) and reistated at need..
]]
 
function p.dtpl(frame)
    local debug = '{| border style="border-collapse:collapse;"\n|+Debugging: Arguments'
    if frame.args[1] ~= nil then debug=debug..'\n|-\n|frame.args[1]||'..frame.args[1] end
    if frame.args[2] ~= nil then debug=debug..'\n|-\n|frame.args[2]||'..frame.args[2] end
    if frame.args[3] ~= nil then debug=debug..'\n|-\n|frame.args[3]||'..frame.args[3] end
    if frame.args[4] ~= nil then debug=debug..'\n|-\n|frame.args[4]||'..frame.args[4] end
    if frame.args['chapteralign'] ~= nil then debug=debug..'\n|-\n|frame.args[\'chapteralign\']||'..frame.args['chapteralign'] end
    if frame.args['chaptertext'] ~= nil then debug=debug..'\n|-\n|frame.args[\'chaptertext\']||'..frame.args['chaptertext'] end
    if frame.args['chapterwidth'] ~= nil then debug=debug..'\n|-\n|frame.args[\'chapterwidth\']||'..frame.args['chapterwidth'] end
    if frame.args['col3align'] ~= nil then debug=debug..'\n|-\n|frame.args[\'col3align\']||'..frame.args['col3align'] end
    if frame.args['col3width'] ~= nil then debug=debug..'\n|-\n|frame.args[\'col3width\']||'..frame.args['col3width'] end
    if frame.args['col4align'] ~= nil then debug=debug..'\n|-\n|frame.args[\'col4align\']||'..frame.args['col4align'] end
    if frame.args['col4text'] ~= nil then debug=debug..'\n|-\n|frame.args[\'col4text\']||'..frame.args['col4text'] end
    if frame.args['col4width'] ~= nil then debug=debug..'\n|-\n|frame.args[\'col4width\']||'..frame.args['col4width'] end
    if frame.args['debug'] ~= nil then debug=debug..'\n|-\n|frame.args[\'debug\']||'..frame.args['debug'] end
    if frame.args['dottext'] ~= nil then debug=debug..'\n|-\n|frame.args[\'dottext\']||'..frame.args['dottext'] end
    if frame.args['entryalign'] ~= nil then debug=debug..'\n|-\n|frame.args[\'entryalign\']||'..frame.args['entryalign'] end
    if frame.args['entrytext'] ~= nil then debug=debug..'\n|-\n|frame.args[\'entrytext\']||'..frame.args['entrytext'] end
    if frame.args['entrywidth'] ~= nil then debug=debug..'\n|-\n|frame.args[\'entrywidth\']||'..frame.args['entrywidth'] end
    if frame.args['hi'] ~= nil then debug=debug..'\n|-\n|frame.args[\'hi\']||'..frame.args['hi'] end
    if frame.args['leadlen'] ~= nil then debug=debug..'\n|-\n|frame.args[\'leadlen\']||'..frame.args['leadlen'] end
    if frame.args['pagetext'] ~= nil then debug=debug..'\n|-\n|frame.args[\'pagetext\']||'..frame.args['pagetext'] end
    if frame.args['spaces'] ~= nil then debug=debug..'\n|-\n|frame.args[\'spaces\']||'..frame.args['spaces'] end
    if frame.args['symbol'] ~= nil then debug=debug..'\n|-\n|frame.args[\'symbol\']||'..frame.args['symbol'] end
    debug=debug..'\n|}\n'
 
    local chapteralign = frame.args['chapteralign'] or 'right'
    local chaptertext = frame.args['chaptertext'] or frame.args[1] or ''
    local chapterwidth = frame.args['chapterwidth'] or '2.5em'
    local col3align = frame.args['col3align'] or 'right'
    local col3width = frame.args['col3width'] or '2em'
    local col4align = frame.args['col4align'] or 'right'
    local col4text = frame.args['col4text'] or ''
    local col4width = frame.args['col4width'] or '2em'
    local dottext = frame.args['dottext'] or ''
    local entryalign = frame.args['entryalign'] or 'left'
    local entrytext = frame.args['entrytext'] or frame.args[2] or 'Entry text'
    local entrywidth = frame.args['entrywidth'] or '80%'
    local hi = frame.args['hi'] or '1em'
    local leadlen = frame.args['leadlen'] or 256;
    local pagetext = frame.args[3] or frame.args['pagetext'] or ''
    local spaces = frame.args['spaces'] or frame.args[4] or 1
    local symbol = frame.args['symbol'] or '.'

    debug = debug..'{| border style="border-collapse:collapse;"\n|+Debugging: Defaults'
    debug = debug..'\n|-\n|chapteralign||'..chapteralign
    debug = debug..'\n|-\n|chaptertext||'..chaptertext
    debug = debug..'\n|-\n|chapterwidth||'..chapterwidth
    debug = debug..'\n|-\n|col3align||'..col3align
    debug = debug..'\n|-\n|col3width||'..col3width
    debug = debug..'\n|-\n|col4align||'..col4align
    debug = debug..'\n|-\n|col4text||'..col4text
    debug = debug..'\n|-\n|col4width||'..col4width
    debug = debug..'\n|-\n|dottext||'..dottext
    debug = debug..'\n|-\n|entryalign||'..entryalign
    debug = debug..'\n|-\n|entrytext||'..entrytext
    debug = debug..'\n|-\n|entrywidth||'..entrywidth
    debug = debug..'\n|-\n|hi||'..hi
    debug = debug..'\n|-\n|leadlen||'..leadlen
    debug = debug..'\n|-\n|pagetext||'..pagetext
    debug = debug..'\n|-\n|spaces||'..spaces
    debug = debug..'\n|-\n|symbol||'..symbol
    debug=debug..'\n|}\n'
    
    local block = symbol..string.rep(' ',spaces)
    
    if dottext == '' then dottext = string.rep( block, leadlen/( 1+mw.ustring.len(''..spaces) ) )..symbol end
    
    debug = debug..'{| border style="border-collapse:collapse;"\n|+Debugging: Progress'
    debug = debug..'\n|-\n|block||'..block
    debug = debug..'\n|-\n|dottext||'..dottext
    debug=debug..'\n|}\n'

    local output = '{| style="border-collapse:collapse; border-spacing:0; empty-cells:hide; width:100%;"\n'
    
    if chaptertext ~= '' then
        output = output..
            '| style="width:'..
            chapterwidth..
            ';max-width:'..
            chapterwidth..
            ';padding:0.0em 0.5em 0.0em 0.0em;vertical-align:top;text-align:'..
            chapteralign..
            ';" | '..
            chaptertext..
            '\n'
    end
    output = output..
        '|<div style="width:100%;position:relative;"><div style="max-width:'..
        entrywidth..
        ';text-align:'..
        entryalign..
        ';text-indent:-'..
        hi..
        ';margin-left:'..
        hi..
        ';"><div style="display:inline;position:relative;text-align:left;padding:0.0em 0.5em 0.0em 0.0em;background:white;z-index:2;">'..
        entrytext..
        '</div></div><div style="position:absolute;left:0px;bottom:0px;width:'..
        hi..
        ';height:0.75em;background:white;z-index:1;">'..
        '</div>'..
        '<div style="position:absolute;width:100%;right:0px;bottom:0px;z-index:0;overflow:hidden;white-space:nowrap;text-align:right;">'..
        '<div style="float:right;">'..
        dottext..
        '</div></div></div>\n'
    output = output..
        '| style="text-align:'..
        col3align..
        ';vertical-align:bottom;padding:0.0em 0.0em 0.0em 0.5em;width:'..
        col3width..
        ';" | '..
        pagetext..
        '\n'
    if col4text ~= '' then
        output = output..
            '|| style="text-align:'..
            col4align..
            ';vertical-align:bottom;width:'..
            col4width..
            ';padding:0.0em 0.0em 0.0em 0.5em;" | '..
            col4text..
            '\n'
    end
    output = output..
        '|}\n'

    if frame.args['debug'] == nil then debug='' end
    
    return debug..output
end

return p