PC Gaming Shelter
An archive dedicated to preserving PC Gaming history and more

Module:Featured: Difference between revisions

From PC Gaming Shelter
No edit summary
No edit summary
 
(One intermediate revision by the same user not shown)
Line 72: Line 72:
   local description = value(args, {'description'}, '')
   local description = value(args, {'description'}, '')
    
    
   local category    = value(args, {'category'}, '')
   local header      = value(args, {'header'}, 'Featured content')
   local header      = value(args, {'header'}, category)
   local category    = value(args, {'category'}, header)
 
 
   local game        = value(args, {'game'}, '')
   local game        = value(args, {'game'}, '')
   local video      = frame:callParserFunction('#tag', {
   local video      = frame:callParserFunction('#tag', {
Line 130: Line 130:
   local description = value(args, {'description'}, '')
   local description = value(args, {'description'}, '')
    
    
   local category    = value(args, {'category'}, '')
   local header      = value(args, {'header'}, 'Featured content')
   local header      = value(args, {'header'}, category)
   local category    = value(args, {'category'}, header)
    
    
   local game        = value(args, {'game'}, '')
   local game        = value(args, {'game'}, '')
    
    
  image = frame:preprocess(
    '[[File:{{PAGENAME:' .. image .. '}}|' .. alt .. ']]'
  )
   setProperties({
   setProperties({
     ['Featured date'] = featuredDate(),
     ['Featured date'] = featuredDate(),
Line 160: Line 156:


   local html = mw.html.create()
   local html = mw.html.create()
  image = frame:preprocess(
    '[[File:{{PAGENAME:' .. image .. '}}|' .. alt .. ']]'
  )


   html:tag('div'):addClass('card bg-dark thumbwall mb-3')
   html:tag('div'):addClass('card bg-dark thumbwall mb-3')

Latest revision as of 12:56, 8 June 2026

Documentation for this module may be created at Module:Featured/doc

local p = {}

local function getArgs(frame)
  return frame:getParent().args or {}
end

local function value(args, names, default)
  for _, name in ipairs(names) do
    local candidate = args[name]
    if candidate ~= nil then
      candidate = mw.text.trim(candidate)
      if candidate ~= '' then
        return candidate
      end
    end
  end

  return default
end

local function setProperties(data)
  local properties = {}

  for property, propertyValue in pairs(data) do
    if propertyValue ~= nil and propertyValue ~= '' then
      properties[property] = propertyValue
    end
  end

  mw.smw.set(properties)
end

local function youtubeId(content)
  if not content:find('://', 1, true) then
    return content
  end

  return content:match('[?&]v=([^&]+)')
    or content:match('youtu%.be/([^?&/]+)')
    or content:match('youtube%.com/embed/([^?&/]+)')
    or ''
end

local function featuredDate()

  local title = mw.title.getCurrentTitle()
  local year, month = title.prefixedText:match('^Featured:(%d%d%d%d)/(%d%d)/')
  if year == nil then
    return ''
  end

  local monthNumber = tonumber(month)
  if monthNumber < 1 or monthNumber > 12 then
    return ''
  end

  return mw.language.getContentLanguage():formatDate(
    'F Y',
    year .. month .. '01000000'
  )
end

function p.video(frame)
  local args = getArgs(frame)
  local mediatype   = value(args, {'mediatype'}, '')
  local title       = value(args, {'title'}, '')
  local tagline     = value(args, {'tagline'}, '')
  local id          = value(args, {'id'}, '')
  local image       = value(args, {'image'}, '')
  local alt         = value(args, {'alt'}, 'Featured video')
  local attribution = value(args, {'attribution'}, '')
  local description = value(args, {'description'}, '')
  
  local header      = value(args, {'header'}, 'Featured content')
  local category    = value(args, {'category'}, header)

  local game        = value(args, {'game'}, '')
  local video       = frame:callParserFunction('#tag', {
    'embedvideo',
    service = 'youtube',
    autoResize = '1',
    title = title,
    id
  })

  setProperties({
    ['Featured date'] = featuredDate(),
    ['Has featured media type'] = mediatype,
    ['Has video id'] = id,
    ['Has card header'] = header,
    ['Has featured title'] = title,
    ['Has featured tagline'] = tagline,
    ['Has featured description'] = description,
    ['Has featured category'] = category,
    ['Has featured media'] = image,
    ['Has attribution'] = attribution,
    ['Has alt text'] = alt,
    ['Related game'] = game
  })

  local displayDescription = description
  if displayDescription ~= '' then
    displayDescription = '\n' .. displayDescription
  end

  local html = mw.html.create()

  html:tag('div'):addClass('card bg-dark thumbwall mb-3')
    :tag('div'):addClass('card-header order-0'):wikitext(header):done()
    :tag('div'):addClass('card-img'):wikitext(video):done()
    :tag('div'):addClass('card-body bg-dark flex-column')
      :tag('div'):addClass('card-title mb-0'):wikitext(title):done()
      :tag('div'):addClass('card-tagline lead'):wikitext(tagline):done()
      :tag('div'):addClass('card-text'):wikitext(displayDescription):done()
    :done()
  :done()

  return html
end

function p.image(frame)
  local args = getArgs(frame)
  local mediatype   = value(args, {'mediatype'}, '')
  local title       = value(args, {'title'}, '')
  local tagline     = value(args, {'tagline'}, '')
  local id          = value(args, {'id'}, '')
  local image       = value(args, {'image'}, '')
  local alt         = value(args, {'alt'}, 'Featured image')
  local attribution = value(args, {'attribution'}, '')
  local description = value(args, {'description'}, '')
  
  local header      = value(args, {'header'}, 'Featured content')
  local category    = value(args, {'category'}, header)
  
  local game        = value(args, {'game'}, '')
  
  setProperties({
    ['Featured date'] = featuredDate(),
    ['Has featured media type'] = mediatype,
    ['Has video id'] = id,
    ['Has card header'] = header,
    ['Has featured title'] = title,
    ['Has featured tagline'] = tagline,
    ['Has featured description'] = description,
    ['Has featured category'] = category,
    ['Has featured media'] = image,
    ['Has attribution'] = attribution,
    ['Has alt text'] = alt,
    ['Related game'] = game
  })

  local displayDescription = description
  if displayDescription ~= '' then
    displayDescription = '\n' .. displayDescription
  end

  local html = mw.html.create()

  image = frame:preprocess(
    '[[File:{{PAGENAME:' .. image .. '}}|' .. alt .. ']]'
  )

  html:tag('div'):addClass('card bg-dark thumbwall mb-3')
    :tag('div'):addClass('card-header order-0'):wikitext(header):done()
    :tag('div'):addClass('card-img'):wikitext(image):done()
    :tag('div'):addClass('card-body bg-dark flex-column')
      :tag('div'):addClass('card-title lead'):wikitext(title):done()
      :tag('div'):addClass('card-text'):wikitext(displayDescription):done()
    :done()
  :done()

  return html
end

return p