Documentation for this module may be created at Module:Find sources/sandbox/doc
-- This module implements {{find sources}} and other similar templates, and
-- also provides a mechanism to easily create new source-finding templates.
-- Define constants
local ROOT_PAGE = 'Module:Find sources'
local LINK_ROOT = ROOT_PAGE .. '/links/' -- for link config modules
local CONFIG_PAGE = ROOT_PAGE .. '/config' -- for global config
-- Load required modules
local checkType = require('libraryUtil').checkType
local yesno = require('Module:yesno')
local cfg = mw.loadData(CONFIG_PAGE)
local p = {}
local function maybeLoadData(page)
local success, data = pcall(mw.loadData, page)
return success and data
end
local function substituteParams(msg, ...)
return mw.message.newRawMessage(msg, ...):plain()
end
local function renderSearchString(searchTerms, separator, transformFunc)
-- This takes a table of search terms and turns it into a search string
-- that can be used in a URL or in a display value. The transformFunc
-- parameter can be used to transform each search term in some way (for
-- example, URL-encoding them).
local searchStrings = {}
for i, s in ipairs(searchTerms) do
searchStrings[i] = s
end
if transformFunc then
for i, s in ipairs(searchStrings) do
searchStrings[i] = transformFunc(s)
end
end
return table.concat(searchStrings, separator)
end
function p._renderLink(code, searchTerms, display)
-- Renders the external link wikicode for one link, given the link code,
-- a table of search terms, and an optional display value.
-- Get link config.
local linkCfg = maybeLoadData(LINK_ROOT .. code)
if not linkCfg then
error(string.format(
"invalid link code '%s'; no link config found at [[%s]]",
code,
LINK_ROOT .. code
))
end
-- Make URL.
local url
do
local separator = linkCfg.separator or "+"
local searchString = renderSearchString(
searchTerms,
separator,
mw.uri.encode
)
url = substituteParams(linkCfg.url, searchString)
end
return string.format('[%s %s]', url, display or linkCfg.display)
end
function p._main(config, args)
-- The main access point from Lua.
checkType('_main', 1, config, 'table', true)
checkType('_main', 2, args, 'table', true)
local title = mw.title.getCurrentTitle()
-- Namespace check.
if title.namespace == 0 and not yesno(config.mainspace) then
local formatString = '<strong class="error">%s</strong>'
if cfg['namespace-error-category'] then
formatString = formatString .. '[[%s:%s]]'
end
return string.format(
formatString,
cfg['namespace-error'],
mw.site.namespaces[14].name,
cfg['namespace-error-category']
)
end
-- Get the search terms from the arguments.
local searchTerms = {}
for i, s in ipairs(args) do
searchTerms[i] = s
end
if not searchTerms[1] then
-- Use the current subpage name as the default search term. If the page
-- uses a disambiguator like "Foo (bar)", make "Foo" the first term and
-- "bar" the second.
local term, dab = title.subpageText:match('^(.*) (%b())$')
if dab then
dab = dab:sub(2, -2) -- Remove parens
end
if term and dab then
searchTerms[1] = term
searchTerms[2] = dab
else
searchTerms[1] = title.subpageText
end
end
searchTerms[1] = '"' .. searchTerms[1] .. '"'
-- Make the intro link
local output = config.introtext or ""
local introLink = config.introlink
if introLink and #introLink ~= 0 then
output = output .. p._renderLink(introLink, searchTerms, renderSearchString(searchTerms, ' '))
output = output .. (config.introseparator or "")
end
-- Make the other links
local links = {}
local separator = cfg['default-separator']
local sep = ''
local linkno = 1
while true do
local linkArg = config["link"..tostring(linkno)]
if linkArg == nil then
break
end
links[linkno] = sep .. p._renderLink(linkArg, searchTerms, config["display"..tostring(linkno)]) ..
(config["after"..tostring(linkno)] or "")
sep = config["separator"..tostring(linkno)] or separator
linkno = linkno + 1
end
output = output .. table.concat(links)
-- Make the blurb.
local span = mw.html.create('span')
span
:addClass('plainlinks')
:wikitext(output)
return tostring(span)
end
function p.main(frame)
return p._main(frame.args, frame:getParent().args)
end
return p
