Module:Subject bar

From Eat Every Plant
Jump to navigation Jump to search

local getPortalImage = require('Module:Portal').image

local p = {}

local function getArgNums(prefix, args)

   -- Returns a table containing the numbers of the arguments that exist for the specified prefix. For example, if the
   -- prefix was 'data', and 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
   local nums = {}
   for k, v in pairs(args) do
       local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
       if num then table.insert(nums, tonumber(num)) end
   end
   table.sort(nums)
   return nums

end

local function makeHorizontalRule()

   local row = mw.html.create('tr')
   row
       :tag('td')
           :attr('colspan', '2')
           :tag('hr', {selfClosing = true})
   return tostring(row)

end

local function makeItem(image, text)

   local root = mw.html.create('li')
   root
       :css('float', 'left')
       :css('margin-left', '0.3em')
       :css('height', '3.6em')
       :tag('span')
           :css('display', 'inline-block')
           :css('margin-right', '0.3em')
           :css('width', '30px')
           :css('line-height', '3.6em')
           :css('text-align', 'center')
           :wikitext(image)
           :done()
       :tag('span')
           :css('display', 'inline-block')
           :css('width', '11em')
           :css('vertical-align', 'middle')
           :wikitext(text)
   return tostring(root)

end

local function makeRow(items, heading, subheading, options)

   if #items < 1 then return end
   local swapHeadingSize = type(options) == 'table' and options.swapHeadingSize or false
   local row = mw.html.create('tr')
   row
       :tag('td')
           :css('width', '175px')
           :tag('span')
               :css('font-size', swapHeadingSize and '90%' or '125%')
               :wikitext(heading)
               :done()
           :tag('br', {selfClosing = true})
               :done()
           :tag('span')
               :css('font-size', swapHeadingSize and '125%' or '90%')
               :wikitext(subheading)
   local list = row:tag('td'):css('text-align', 'left'):tag('ul')
   for i, item in ipairs(items) do
       local image = item[1]
       local text = item[2]
       list
           :wikitext(makeItem(image, text))
   end
   return tostring(row)

end

local function makeNumberedRow(prefix, args, heading, subheading, getItemValsFunc, options)

   if args[prefix] then
       args[prefix .. '1'] = args[prefix]
   end
   local argNums = getArgNums(prefix, args)
   local items = {}
   for i, argNum in ipairs(argNums) do
       local image, text = getItemValsFunc(args[prefix .. tostring(argNum)])
       table.insert(items, {image, text})
   end
   return makeRow(items, heading, subheading, options)

end

function p._main(args)

   local rows = {}
   -- Get the book row text.
   local bookHeading = "Books"
   local bookSubheading = 'View or order collections of articles'
   local function getBookItemVals(book)
       local image = ''
       local text = mw.ustring.format("%s", book, book)
       return image, text
   end
   local bookRow = makeNumberedRow('book', args, bookHeading, bookSubheading, getBookItemVals)
   table.insert(rows, bookRow)
   -- Get the portal row text
   local portalHeading = "Portals"
   local portalSubheading = 'Access related topics'
   local function getPortalItemVals(portal)
       local image = mw.ustring.format('30x30px', getPortalImage{portal})
       local text = mw.ustring.format("%s portal", portal, portal)
       return image, text
   end
   local portalRow = makeNumberedRow('portal', args, portalHeading, portalSubheading, getPortalItemVals)
   table.insert(rows, portalRow)
   -- Get the sister projects row text.
   local sisters = {
       {arg = 'commons', image = 'Commons-logo.svg', prefix = 'commons', display = 'Media', from = 'Commons'},
       {arg = 'species', image = 'Wikispecies-logo.svg', prefix = 'wikispecies', display = 'Species directories', from = 'Wikispecies'},
       {arg = 'voy', image = 'Wikivoyage-Logo-v3-icon.svg', prefix = 'voy', display = 'Travel guides', from = 'Wikivoyage'},
       {arg = 'n', image = 'Wikinews-logo.svg', prefix = 'wikinews', display = 'News stories', from = 'Wikinews'},
       {arg = 'wikt', image = 'Wiktionary-logo-v2.svg', prefix = 'wiktionary', postfix = 'English', display = 'Definitions', from = 'Wiktionary'},
       {arg = 'b', image = 'Wikibooks-logo.svg', prefix = 'wikibooks', display = 'Textbooks', from = 'Wikibooks'},
       {arg = 'q', image = 'Wikiquote-logo.svg', prefix = 'wikiquote', display = 'Quotations', from = 'Wikiquote'},
       {arg = 's', image = 'Wikisource-logo.svg', prefix = 'wikisource', display = 'Source texts', from = 'Wikisource'},
       {arg = 'v', image = 'Wikiversity-logo.svg', prefix = 'wikiversity', display = 'Learning resources', from = 'Wikiversity'},
       {arg = 'd', image = 'Wikidata-logo.svg', prefix = 'wikidata', display = 'Data', from = 'Wikidata'},
       {arg = 'spoken', image = 'Sound-icon.svg', prefix = 'spoken wikipedia', display = 'Listen to this page', from = 'Spoken Wikipedia'},
   }
   local sisterItems = {}
   for i, t in ipairs(sisters) do
       if args[t.arg] then
           -- Get the image value.
           local image = mw.ustring.format('30x30px', t.image)
           -- Get the text value.
           local prefix = t.prefix
           local search = args[t.arg .. '-search'] or mw.title.getCurrentTitle().text
           local postfix = t.postfix
           postfix = postfix and ('#' .. postfix) or 
           local display = t.display
           local from = t.from
           local text = mw.ustring.format(
               '%s
from %s', prefix, search, postfix, display, from ) if t.arg == 'spoken' then text = mw.ustring.format('%s on %s
File:%s', display, from, args[t.arg] ) end -- Add the values to the items table. table.insert(sisterItems, {image, text}) end end local sisterHeading = "Find out more on Wikipedia's" local sisterSubheading = "Sister projects" local sisterRow = makeRow(sisterItems, sisterHeading, sisterSubheading, {swapHeadingSize = true}) table.insert(rows, sisterRow)
   -- Make the table.
   local root = mw.html.create('table')
   root
       :attr('role', 'presentation')
       :addClass('noprint')
       :addClass('navbox')
       :addClass('metadata')
       :addClass('plainlist')
       :css('background-color', '#f9f9f9')
       :css('border', '1px solid #aaa')
       :css('clear', 'both')
       :css('margin-bottom', '0.5em')
       :css('margin-top', '0.5em')
       :wikitext(table.concat(rows, makeHorizontalRule()))
   return tostring(root)

end

function p.main(frame)

   -- If called via #invoke, use the args passed into the invoking template, or the args passed to #invoke if any exist. Otherwise
   -- assume args are being passed directly in from the debug console or from another Lua module.
   local origArgs
   if frame == mw.getCurrentFrame() then
       origArgs = frame:getParent().args
       for k, v in pairs(frame.args) do
           origArgs = frame.args
           break
       end
   else
       origArgs = frame
   end
   -- Remove blank arguments.
   local args = {}
   for k, v in pairs(origArgs) do
       if v ~=  then
           args[k] = v
       end
   end
   return p._main(args)

end

return p