Module:Search link
MyWikiBiz, Author Your Legacy — Thursday January 09, 2025
Jump to navigationJump to searchDocumentation for this module may be created at Module:Search link/doc
-- This module implements {{search link}} local p = {} local searchProfiles = { -- "advanced" is not included, as we automatically use the advanced profile -- if individual namespaces are specified. default = true, images = true, all = true } local function escapeTemplate(s) s = s:gsub('[{}|=]', function(match) return mw.text.nowiki(match) end) return s end local function parseNamespaceList(ns) -- s can be a search profile, a comma-separated list of namespaces, or a -- Lua array. -- Items in the list can be any valid key to mw.site.namespaces. -- We return either a profile string or a table of namespace numbers. -- Check for no input or search profile strings. local default = 'default' if not ns then return default elseif searchProfiles[ns] then return ns end -- Parse the string for valid namespaces local ret = {} local keys if type(ns) == 'table' then keys = ns else keys = mw.text.split(ns, '%s*,%s*') end for _, key in ipairs(keys) do key = tonumber(key) or key if type(key) == 'string' and key:lower() == 'main' then key = 0 end if mw.site.namespaces[key] then ret[#ret + 1] = mw.site.namespaces[key].id end end -- Check that we were passed at least one namespace, and return the table. if #ret < 1 then return default else return ret end end local function makeLink(searchString, display, ns) -- Normalise the input. if not searchString then -- Show the correct syntax if we are not passed a search string. return '<code>' .. escapeTemplate("{{search link|''search string''|''link text''}}") .. '</code>' end display = display or searchString ns = parseNamespaceList(ns) -- Build the query table local query = { search = searchString, fulltext = 'Search' } if searchProfiles[ns] then query.profile = ns else query.profile = 'advanced' for _, nsid in ipairs(ns) do query['ns' .. tostring(nsid)] = '1' end end -- Make the URL. local url = mw.uri.fullUrl('Special:Search', query) url = tostring(url) -- Add the span tags and display value. return string.format( '<span class="plainlinks">[%s %s]</span>', url, display ) end local function makeNamespaceWarningBanner(title) if title.namespace == 0 then return require('Module:Message box').main('mbox', { type = 'content', text = mw.text.nowiki('{{') .. '[[Template:Search link|Search link]]' .. mw.text.nowiki('}}') .. ' ' .. 'should not be used in [[WP:WIAA|articles]] as links to ' .. '"search result pages" are among the ' .. '[[WP:LINKSTOAVOID|links normally to be avoided]].', textstyle = 'text-align: center' }) else return '' end end function p._main(searchString, display, ns, title) title = title or mw.title.getCurrentTitle() return makeLink(searchString, display, ns) .. makeNamespaceWarningBanner(title) end function p.main(frame) local args = require('Module:Arguments').getArgs(frame, { wrappers = 'Template:Search link' }) local searchString = args[1] local display = args[2] local ns = args.ns return p._main(searchString, display, ns) end return p