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
 
(12 intermediate revisions by the same user not shown)
Line 19: Line 19:
end
end


local function setFeaturedProperties(data)
local function setProperties(data)
   local properties = {}
   local properties = {}


Line 63: Line 63:
function p.video(frame)
function p.video(frame)
   local args = getArgs(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 header = value(args, { 2, 'header' }, 'Navigate')
   local game        = value(args, {'game'}, '')
  local featuredTitle = value(args, { 3, 'title' }, '')
   local video       = frame:callParserFunction('#tag', {
  local featuredTagline = value(args, { 4, 'tagline' }, '')
  local title = featuredTitle ~= '' and featuredTitle or 'Title'
  local tagline = featuredTagline ~= '' and featuredTagline or 'Tagline'
  local content = value(args, { 5, 'id', 'url' }, '')
  local description = value(args, { 6, 'description', 'text' }, '')
  local contentUrl = content:find('://', 1, true) and content or ''
  local externalLink = value(args, { 'external link', 'url' }, contentUrl)
  local videoId = value(args, { 'video id', 'id' }, youtubeId(content))
  local featuredMedia = value(args, { 'featured media', 'media' }, '')
  local category = value(args, { 'featured category', 'category' }, 'Video of the Month')
   local video = frame:callParserFunction('#tag', {
     'embedvideo',
     'embedvideo',
     service = 'youtube',
     service = 'youtube',
     autoResize = '1',
     autoResize = '1',
     content
     title = title,
    id
   })
   })


   setFeaturedProperties({
   setProperties({
     ['Featured date'] = featuredDate(),
     ['Featured date'] = featuredDate(),
     ['Has featured media type'] = 'Video',
     ['Has featured media type'] = mediatype,
     ['Has featured media'] = featuredMedia,
     ['Has video id'] = id,
     ['Has external link'] = externalLink,
     ['Has card header'] = header,
    ['Has video id'] = videoId,
     ['Has featured title'] = title,
     ['Has featured title'] = featuredTitle,
     ['Has featured tagline'] = tagline,
     ['Has featured tagline'] = featuredTagline,
     ['Has featured description'] = description,
     ['Has featured description'] = description,
     ['Has featured category'] = category,
     ['Has featured category'] = category,
     ['Has attribution'] = value(args, { 'attribution' }, ''),
     ['Has featured media'] = image,
     ['Has alt text'] = value(args, { 'alt text', 'alt' }, ''),
    ['Has attribution'] = attribution,
     ['Has related game'] = value(args, { 'game' }, '')
     ['Has alt text'] = alt,
     ['Related game'] = game
   })
   })


Line 120: Line 121:
function p.image(frame)
function p.image(frame)
   local args = getArgs(frame)
   local args = getArgs(frame)
 
   local mediatype  = value(args, {'mediatype'}, '')
   local header = value(args, { 2, 'header' }, 'Navigate')
   local title      = value(args, {'title'}, '')
   local featuredTitle = value(args, { 3, 'title' }, '')
   local tagline    = value(args, {'tagline'}, '')
   local featuredTagline = value(args, { 4, 'tagline' }, '')
   local id          = value(args, {'id'}, '')
   local title = featuredTitle ~= '' and featuredTitle or 'Title'
   local image      = value(args, {'image'}, '')
   local content = value(args, { 5, 'image' }, 'Shelter.png')
   local alt        = value(args, {'alt'}, 'Featured image')
   local description = value(args, { 6, 'description', 'text' }, '')
  local attribution = value(args, {'attribution'}, '')
   local altText = value(args, { 'alt text', 'alt' }, 'Featured image')
   local description = value(args, {'description'}, '')
   local featuredMedia = value(args, { 'featured media', 'media' }, 'File:' .. content)
 
   local category = value(args, { 'featured category', 'category' }, 'Picture of the Month')
   local header      = value(args, {'header'}, 'Featured content')
   local image = frame:preprocess(
   local category   = value(args, {'category'}, header)
    '[[File:{{PAGENAME:' .. content .. '}}|' .. altText .. ']]'
 
   )
   local game        = value(args, {'game'}, '')
 
    
   setFeaturedProperties({
   setProperties({
     ['Featured date'] = featuredDate(args),
     ['Featured date'] = featuredDate(),
     ['Has featured media type'] = 'Image',
     ['Has featured media type'] = mediatype,
     ['Has featured media'] = featuredMedia,
     ['Has video id'] = id,
     ['Has external link'] = value(args, { 'external link', 'url' }, ''),
     ['Has card header'] = header,
     ['Has featured title'] = featuredTitle,
     ['Has featured title'] = title,
     ['Has featured tagline'] = featuredTagline,
     ['Has featured tagline'] = tagline,
     ['Has featured description'] = description,
     ['Has featured description'] = description,
     ['Has featured category'] = category,
     ['Has featured category'] = category,
     ['Has attribution'] = value(args, { 'attribution' }, ''),
     ['Has featured media'] = image,
     ['Has alt text'] = altText,
    ['Has attribution'] = attribution,
     ['Has related game'] = value(args, { 'game' }, '')
     ['Has alt text'] = alt,
     ['Related game'] = game
   })
   })


Line 154: 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