Module:Pagelist

From LIMSWiki
Jump to navigationJump to search

local p = {}

-- Get the page object. This will return the page object for the page -- specified, or nil if there are errors in the title, if the -- expensive function count has been exceeded, or if the page was not -- specified. function getPageObject( page )

   if not page then
       return nil
   end
   -- Get the page object, passing the function through pcall 
   -- in case we are over the expensive function count limit.
   local noError, pageObject = pcall(mw.title.new, page)
   if not noError then
       return nil
   else
       return pageObject
   end

end

-- Process the separator parameter. local function getSeparator( sep )

   if sep and type(sep) == 'string' then
       if sep == 'dot' 
           or sep =='pipe'
           or sep == 'comma'
           or sep == 'tpt-languages' then
           return mw.message.new( sep .. '-separator' ):plain()
       else
           return sep
       end
   else
       return nil
   end

end

local function generateLink( page, nspace, delim, edelim )

   if not page then
       return nil
   end
   local pagename = getPageObject( page )
   if not pagename then
       -- Default to the args we were passed if our page
       -- object was nil.
       pagename = page
   else
       pagename = pagename.text
   end
   delim = delim or 
   edelim = edelim or delim
   nspace = nspace or mw.title.getCurrentTitle().nsText
   return mw.ustring.format( 
       '%s%s%s',
       delim, nspace, pagename, page, edelim
   )

end

local function _main( args )

   local t = {}
   local separator = getSeparator( args.separator )
   local conjunction = getSeparator( args.conjunction )
   for i, v in ipairs( args ) do
       table.insert( t, generateLink(
           v, args.nspace, args.delim, args.edelim
       ) )
   end
   return mw.text.listToText( t, separator, conjunction )

end

function p.main( frame )

   local origArgs
   if frame == mw.getCurrentFrame() then
       -- We're being called via #invoke. If the invoking template passed any arguments,
       -- use them. Otherwise, use the arguments that were passed into the template.
       origArgs = frame:getParent().args
       for k, v in pairs( frame.args ) do
           origArgs = frame.args
           break
       end
   else        
       -- We're being called from another module or from the debug console, so assume
       -- the arguments are passed in directly.
       origArgs = frame
   end
   
   -- Process integer args. Allow for explicit positional arguments that are
   -- specified out of order, e.g. entry3.
   -- After processing, the args can be accessed accurately from ipairs.
   local args = {}
   for k, v in pairs( origArgs ) do
       if type( k ) == 'number' and 
           k >= 1 and
           math.floor( k ) == k and
           mw.ustring.match( v, '%S' ) then -- Remove blank or whitespace values.
           table.insert( args, k )
       end
   end
   table.sort( args )
   for i, v in ipairs( args ) do
       args[ i ] = origArgs[ v ]
       -- Trim whitespace.
       if type( args[ i ] ) == 'string' then
           args[ i ] = mw.text.trim( args[ i ] )
       end
   end
   
   -- Get old named args. We don't need to remove blank values
   -- as for the nspace and edelim parameters the behaviour is different
   -- depending on whether the parameters are blank or absent, and for
   -- the delim parameter the default should be the blank string anyway.
   args.delim = origArgs.delim
   args.edelim = origArgs.edelim
   args.nspace = origArgs.nspace
   
   -- Get new named args, "separator" and "conjunction", and strip blank values.
   if origArgs.separator and origArgs.separator ~=  then
       args.separator = origArgs.separator
   end
   if origArgs.conjunction and origArgs.conjunction ~=  then
       args.conjunction = origArgs.conjunction
   end

   return _main( args )

end

return p