Jump to content

Module:Namespace detect

Permanently protected module
From Wikipedia, the free encyclopedia

--[[---------------------------------------------------------------------------------- ---- NAMESPACE DETECT ---- ---- This module implements the {{namespace detect}} template in Lua, with a ---- few improvements: all namespaces and all namespace aliases are supported, ---- and namespace names are detected automatically for the local wiki. The ---- module can also use the corresponding subject namespace value if it is ---- used on a talk page. Parameter names can be configured for different wikis ---- by altering the values in the "cfg" table in ---- Module:Namespace detect/config. ---- ------------------------------------------------------------------------------------]]localdata=mw.loadData('Module:Namespace detect/data')localargKeys=data.argKeyslocalcfg=data.cfglocalmappings=data.mappingslocalyesno=require('Module:Yesno')localmArguments-- Lazily initialise Module:ArgumentslocalmTableTools-- Lazily initilalise Module:TableToolslocalustringLower=mw.ustring.lowerlocalp={}localfunctionfetchValue(t1,t2)-- Fetches a value from the table t1 for the first key in array t2 where-- a non-nil value of t1 exists.fori,keyinipairs(t2)dolocalvalue=t1[key]ifvalue~=nilthenreturnvalueendendreturnnilendlocalfunctionequalsArrayValue(t,value)-- Returns true if value equals a value in the array t. Otherwise-- returns false.fori,arrayValueinipairs(t)doifvalue==arrayValuethenreturntrueendendreturnfalseendfunctionp.getPageObject(page)-- Get the page object, passing the function through pcall in case of-- errors, e.g. being over the expensive function count limit.ifpagethenlocalsuccess,pageObject=pcall(mw.title.new,page)ifsuccessthenreturnpageObjectelsereturnnilendelsereturnmw.title.getCurrentTitle()endend-- Provided for backward compatibility with other modulesfunctionp.getParamMappings()returnmappingsendlocalfunctiongetNamespace(args)-- This function gets the namespace name from the page object.localpage=fetchValue(args,argKeys.demopage)ifpage==''thenpage=nilendlocaldemospace=fetchValue(args,argKeys.demospace)ifdemospace==''thendemospace=nilendlocalsubjectns=fetchValue(args,argKeys.subjectns)localretifdemospacethen-- Handle "demospace = main" properly.ifequalsArrayValue(argKeys.main,ustringLower(demospace))thenret=mw.site.namespaces[0].nameelseret=demospaceendelselocalpageObject=p.getPageObject(page)ifpageObjectthenifpageObject.isTalkPagethen-- Get the subject namespace if the option is set,-- otherwise use "talk".ifyesno(subjectns)thenret=mw.site.namespaces[pageObject.namespace].subject.nameelseret='talk'endelseret=pageObject.nsTextendelsereturnnil-- return nil if the page object doesn't exist.endendret=ret:gsub('_',' ')returnustringLower(ret)endfunctionp._main(args)-- Check the parameters stored in the mappings table for any matches.localnamespace=getNamespace(args)or'other'-- "other" avoids nil table keyslocalparams=mappings[namespace]or{}localret=fetchValue(args,params)--[[ -- If there were no matches, return parameters for other namespaces. -- This happens if there was no text specified for the namespace that -- was detected or if the demospace parameter is not a valid -- namespace. Note that the parameter for the detected namespace must be -- completely absent for this to happen, not merely blank. --]]ifret==nilthenret=fetchValue(args,argKeys.other)endreturnretendfunctionp.main(frame)mArguments=require('Module:Arguments')localargs=mArguments.getArgs(frame,{removeBlanks=false})localret=p._main(args)returnretor''endfunctionp.table(frame)--[[ -- Create a wikitable of all subject namespace parameters, for -- documentation purposes. The talk parameter is optional, in case it -- needs to be excluded in the documentation. --]]-- Load modules and initialise variables.mTableTools=require('Module:TableTools')localnamespaces=mw.site.namespaceslocalcfg=data.cfglocaluseTalk=type(frame)=='table'andtype(frame.args)=='table'andyesno(frame.args.talk)-- Whether to use the talk parameter.-- Get the header names.localfunctioncheckValue(value,default)iftype(value)=='string'thenreturnvalueelsereturndefaultendendlocalnsHeader=checkValue(cfg.wikitableNamespaceHeader,'Namespace')localaliasesHeader=checkValue(cfg.wikitableAliasesHeader,'Aliases')-- Put the namespaces in order.localmappingsOrdered={}fornsname,paramsinpairs(mappings)doifuseTalkornsname~='talk'thenlocalnsid=namespaces[nsname].id-- Add 1, as the array must start with 1; nsid 0 would be lost otherwise.nsid=nsid+1mappingsOrdered[nsid]=paramsendendmappingsOrdered=mTableTools.compressSparseArray(mappingsOrdered)-- Build the table.localret='{| class="wikitable"'..'\n|-'..'\n! '..nsHeader..'\n! '..aliasesHeaderfori,paramsinipairs(mappingsOrdered)doforj,paraminipairs(params)doifj==1thenret=ret..'\n|-'..'\n| <code>'..param..'</code>'..'\n| 'elseifj==2thenret=ret..'<code>'..param..'</code>'elseret=ret..', <code>'..param..'</code>'endendendret=ret..'\n|-'..'\n|}'returnretendreturnp
close