13,398
edits
(Created page with "------------------------------------------------------------------------------- -- Module:Wikipedia ads -- -- This module displays a random banner-style advert for a Wikipedia project, -- page or process. It implements Template:Wikipedia ads. ------------------------------------------------------------------------------- -- Set constants local LIST_MODULE = 'Module:Wikipedia ads/list' local DATA_MODULE = 'Module:Wikipedia ads/data' local p =...") |
No edit summary |
||
Line 1: | Line 1: | ||
------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ||
-- Module: | -- Module:Bharatpedia ads | ||
-- | -- | ||
-- This module displays a random banner-style advert for a | -- This module displays a random banner-style advert for a Bharatpedia project, | ||
-- page or process. It implements [[Template: | -- page or process. It implements [[Template:Bharatpedia ads]]. | ||
------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ||
-- Set constants | -- Set constants | ||
local LIST_MODULE = 'Module: | local LIST_MODULE = 'Module:Bharatpedia ads/list' | ||
local DATA_MODULE = 'Module: | local DATA_MODULE = 'Module:Bharatpedia ads/data' | ||
local p = {} | local p = {} | ||
Line 14: | Line 14: | ||
local function addWarning(msg) | local function addWarning(msg) | ||
table.insert(warnings, msg) | |||
end | end | ||
local function makeWikilink(page, display) | local function makeWikilink(page, display) | ||
return string.format('[[%s|%s]]', page, display) | |||
end | end | ||
local function makeUrlLink(url, display) | local function makeUrlLink(url, display) | ||
url = tostring(url) | |||
return string.format('[%s %s]', url, display) | |||
end | end | ||
local function colorText(s, color) | local function colorText(s, color) | ||
return string.format('<span style="color:%s">%s</span>', color, s) | |||
end | end | ||
local function getImageData(args) | local function getImageData(args) | ||
-- This function gets an image data from the data module. It also tracks | |||
-- whether the image data choice was random. | |||
local data = mw.loadData(DATA_MODULE) | |||
local function getSomeImageData(id, param) | |||
id = tonumber(id) or id | |||
local someImageData = data.ids[id] | |||
if someImageData then | |||
return someImageData | |||
else | |||
addWarning(string.format("ID '%s' does not exist", tostring(id))) | |||
return nil | |||
end | |||
end | |||
-- Get the image data of the ad to display. | |||
local imageData, isRandom | |||
if args.ad then | |||
imageData = getSomeImageData(args.ad, 'ad') | |||
if not imageData then | |||
return nil | |||
end | |||
isRandom = false | |||
else | |||
local imageDataArray, length | |||
if args[1] then | |||
imageDataArray = {} | |||
for i, id in ipairs(args) do | |||
imageDataArray[#imageDataArray + 1] = getSomeImageData(id, i) | |||
end | |||
length = #imageDataArray | |||
if length < 1 then | |||
return nil | |||
end | |||
else | |||
imageDataArray = data.list | |||
length = data.noAds | |||
end | |||
assert(length >= 1, string.format( | |||
'no ads were found in [[%s]]', | |||
DATA_MODULE | |||
)) | |||
isRandom = length > 1 | |||
if isRandom then | |||
math.randomseed(os.clock() * 1000000000) | |||
imageData = imageDataArray[math.random(length)] | |||
else | |||
imageData = imageDataArray[1] | |||
end | |||
end | |||
-- Check that the image data has the required fields. We have already | |||
-- checked the ID in the data module. | |||
for i, field in ipairs{'image', 'link'} do | |||
assert(imageData[field], string.format( | |||
"Invalid image data in [[%s]]; table with ID '%s' has no '%s' field", | |||
LIST_MODULE, tostring(imageData.id), field | |||
)) | |||
end | |||
return imageData, isRandom | |||
end | end | ||
local function renderAd(imageData, args, title, isRandom) | local function renderAd(imageData, args, title, isRandom) | ||
local width = tonumber(args.width) or 468 | |||
local maxWidth = width + 9 | |||
local linkColor = args.linkcolor or '#002bb8' | |||
-- Table root | |||
local root = mw.html.create('table') | |||
root | |||
:addClass('plainlinks qxz-ads') | |||
:css('color', args.color or '#555555') | |||
:css('border', 'none') | |||
:css('background', args.background) | |||
:css('line-height', '1em') | |||
:css('font-size', '90%') | |||
:css('display', 'block') | |||
:css('overflow', 'auto') | |||
:css('max-width', maxWidth .. 'px') | |||
if args.float then | |||
root:css('float', args.float) | |||
root:css('margin', args.margin) | |||
else | |||
root:css('margin', args.margin or '0 auto') | |||
end | |||
-- Image row | |||
root | |||
:tag('tr') | |||
:tag('td') | |||
:attr('colspan', 2) | |||
:css('border', 'none') | |||
:wikitext(string.format( | |||
'', | |||
imageData.image, | |||
width, | |||
imageData.link, | |||
imageData.link | |||
)) | |||
-- Links row | |||
if not args.nolinks then | |||
local linksRow = root:tag('tr') | |||
-- Bharatpedia ads link | |||
linksRow | |||
:tag('td') | |||
:css('border', 'none') | |||
:wikitext(makeWikilink( | |||
'Template:Bharatpedia ads', | |||
colorText('Bharatpedia ads', linkColor) | |||
)) | |||
-- File info, purge and ID | |||
local links = {} | |||
links[#links + 1] = makeWikilink( | |||
':File:' .. imageData.image, | |||
colorText('file info', linkColor) | |||
) | |||
if args.showpurge or isRandom then | |||
links[#links + 1] = makeUrlLink( | |||
title:fullUrl{action = 'purge'}, | |||
colorText('show another', linkColor) | |||
) | |||
end | |||
links[#links + 1] = '#' .. tostring(imageData.id) | |||
linksRow | |||
:tag('td') | |||
:css('text-align', 'right') | |||
:css('border', 'none') | |||
:wikitext(table.concat(links, ' – ')) | |||
end | |||
return tostring(root) | |||
end | end | ||
local function renderWarnings(args, title) | local function renderWarnings(args, title) | ||
if #warnings < 1 then | |||
return nil | |||
end | |||
-- Error list | |||
local root = mw.html.create('div') | |||
:css('width', '468px') | |||
if args.float then | |||
root | |||
:css('float', args.float) | |||
:css('clear', 'both') | |||
else | |||
root:css('margin', '0 auto') | |||
end | |||
local list = root:tag('ul') | |||
:addClass('error') | |||
:css('font-size', '90%') | |||
for _, msg in ipairs(warnings) do | |||
list | |||
:tag('li') | |||
:wikitext(string.format( | |||
'Bharatpedia ads error: %s ([[Template:Bharatpedia ads#Errors|help]]).', | |||
msg | |||
)) | |||
end | |||
-- Category. We use [[Module:Category handler]] for its blacklist. | |||
local mCatHandler = require('Module:Category handler') | |||
local category = mCatHandler._main{ | |||
all = '[[Category:Bharatpedia ads templates with errors]]', | |||
nocat = args.nocat, | |||
page = title and title.prefixedText | |||
} | |||
local ret = tostring(root) | |||
if category then | |||
ret = ret .. category | |||
end | |||
return ret | |||
end | end | ||
function p._main(args, title) | function p._main(args, title) | ||
title = title or mw.title.getCurrentTitle() | |||
local ret = {} | |||
local imageData, isRandom = getImageData(args) | |||
if imageData then | |||
ret[#ret + 1] = renderAd(imageData, args, title, isRandom) | |||
end | |||
ret[#ret + 1] = renderWarnings(args, title) | |||
if #ret > 0 then | |||
return table.concat(ret) | |||
else | |||
return nil | |||
end | |||
end | end | ||
function p.main(frame) | function p.main(frame) | ||
local args = require('Module:Arguments').getArgs(frame, { | |||
wrappers = 'Template:Bharatpedia ads' | |||
}) | |||
return p._main(args) | |||
end | end | ||
return p | return p |
edits