Module:Find sources/sandbox

-- This module implements 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 = ' %s ' 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