Module:Wikimedia Resource Center
Usage
editEmbed a specific category of entries
edit{{#invoke:Wikimedia Resource Center|category|CATEGORYNAME}}
Options for CATEGORYNAME:
- Contact and Questions
- Skills Development
- Grants Support
- Programs Support
- Software Basics
- Software Development
- Technical Infrastructure
- Global Reach Partnerships
- Legal
- Communications
Example:
{{#invoke:Wikimedia Resource Center|category|Programs Support}}
Embed the list with filtering by audience
edit{{#invoke:Wikimedia Resource Center|audience|AUDIENCENAME}}
Options for AUDIENCENAME:
- For program leaders
- For contributors
- For developers
- For affiliate leaders
Example:
{{#invoke:Wikimedia Resource Center|audience|For program leaders}}
Embed everything
edit{{#invoke:Wikimedia Resource Center|audience|all}}
Translation
editThe strings for this module are contained in Template:i18n/Wikimedia Resource Center.
local p = {}
-- To edit the list of resources in its raw form, go to the page named below.
content = require( 'Module:Wikimedia Resource Center/Content' )
is_rtl = require( 'Module:Is rtl' )
lang = mw.getCurrentFrame():preprocess('{{int:lang}}')
ModuleMsg = require( 'Module:ModuleMsg' )
msg = ModuleMsg:get_msgs('Template:I18n/Wikimedia Resource Center', lang)
function get_translation(details)
-- Get translated version of a list entry
--
-- Usage:
-- details: table containing the entry to translate
--
-- Return table: translated entry (with English as fallback)
if details.unique_id == nil or lang == 'en' then
-- This system assumes that a unique ID is assigned.
return details
end
for k, v in pairs(details) do
if msg['content-' .. details.unique_id .. '-' .. k] ~= nil then
details[k] = msg['content-' .. details.unique_id .. '-' .. k]
end
end
return details
end
function get_directionality()
-- Should something be left-aligned or right-aligned?
if is_rtl[lang] == true then
return 'right'
end
return 'left'
end
function build_entry(frame, details)
-- Builds an individual entry on a Resource Center view
--
-- Usage:
-- frame: The frame object
-- details: a table with keys header, description, contact, related,
-- category, audiences (header is required)
--
-- Return string: wikitext
details = get_translation(details)
template_args = {
header = details.header,
['contact-label'] = msg['editor-field-contact'],
['related-pages-label'] = msg['editor-field-relatedpages'],
}
if details.community ~= nil then
template_args.community = details.community
end
if details.unique_id ~= nil then
template_args.unique_id = details.unique_id
end
if details.description ~= nil then
template_args.description = details.description
end
if details.contact ~= nil then
template_args.contact = details.contact
end
if details.related ~= nil then
template_args.related = details.related
end
entrycontent = frame:expandTemplate{
title = 'Wikimedia Resource Center listing',
args = template_args
}
return entrycontent
end
function build_category(frame, entries, category_name)
-- Helper function for building audience views and standalone category views
--
-- Usage:
-- frame: The frame object
-- entries: table, containing the content tables
-- category_name: string, category to build a list for
--
-- Return string: wikitext
categorycontent = ''
for _, details in ipairs(entries) do
categorycontent = categorycontent .. build_entry(frame, details)
end
categorycontent = categorycontent .. '\n\n<div class="wrc-add-button" data-wrc-category="' .. category_name .. '"></div>'
return '<div dir="' .. frame:expandTemplate{ title = 'dir', args = { lang } } .. '">' .. categorycontent .. '</div>'
end
function p.category(frame)
-- Builds a category-level view (but without the section header)
--
-- Takes one parameter: string of the category name to filter against
--
-- Returns wikitext
for _, value in ipairs(frame.args) do
category = value
end
filtered_entries = {}
for _, entry in ipairs(content) do
if entry.category == category then
table.insert(filtered_entries, entry)
end
end
return build_category(frame, filtered_entries, category)
end
function p.audience(frame)
-- Builds an audience-level view
--
-- Takes one parameter: string of the audience name to filter against
--
-- Returns wikitext
audiencecontent = ''
for _, audience in ipairs(frame.args) do
-- In principle there should only be one argument but we still need to
-- iterate like this.
category_tables = {
{name = 'Contact and Questions', content = {}},
{name = 'Skills Development', content = {}},
{name = 'Grants Support', content = {}},
{name = 'Programs Support', content = {}},
{name = 'Software Basics', content = {}},
{name = 'Software Development', content = {}},
{name = 'Technical Infrastructure', content = {}},
{name = 'Global Reach Partnerships', content = {}},
{name = 'Legal', content = {}},
{name = 'Communications', content = {}},
}
-- `content` is a table of tables. Lua doesn't have arrays but if it did you
-- could think of it like an array of tables. Or an array of objects. An
-- array of associative arrays?
--
-- This first pass re-organizes the `content` table from a flat table to one
-- divided into the different categories
for _, entry in ipairs(content) do
allow_this_one = false
if audience == 'all' then
allow_this_one = true
else
for __, entry_audience in ipairs(entry.audiences) do
if entry_audience == audience then
allow_this_one = true
end
end
end
if allow_this_one == true then
entry_is_assigned = false
for index, blob in ipairs(category_tables) do
if blob.name == entry.category then
entry_is_assigned = true
table.insert(category_tables[index]['content'], entry)
break
end
end
if entry_is_assigned == false then
table.insert(category_tables, {name = entry.category, content = {entry}})
end
end
end
for index, blob in ipairs(category_tables) do
if #blob.content > 0 then
msgname = 'category-' .. string.gsub(string.lower(blob.name), ' ', '-')
if msg[msgname] ~= nil then
relevant_msg = msg[msgname]
else
relevant_msg = 'error'
end
audiencecontent = audiencecontent .. '<h2 style="font-size:2em; text-align:' .. get_directionality() .. '">' .. relevant_msg .. '</h2>'
audiencecontent = audiencecontent .. build_category(frame, blob.content, blob.name)
end
end
end
return audiencecontent
end
return p