Jump to content

Module:Labelled list hatnote

Permanently protected module
From Wikipedia, the free encyclopedia

---------------------------------------------------------------------------------- Labelled list ---- ---- This module does the core work of creating a hatnote composed of a list ---- prefixed by a colon-terminated label, i.e. "LABEL: [andList of pages]", ---- for {{see also}} and similar templates. ----------------------------------------------------------------------------------localmHatnote=require('Module:Hatnote')localmHatlist=require('Module:Hatnote list')localmArguments--initialize lazilylocalyesno--initialize lazilylocalp={}-- Defaults global to this modulelocaldefaults={label='See also',--Final fallback for label argumentlabelForm='%s: %s',prefixes={'label','label ','l'},template='Module:Labelled list hatnote'}-- Localizable message stringslocalmsg={errorSuffix='#Errors',noInputWarning='no page names specified',noOutputWarning="'''[[%s]] — no output: none of the target pages exist.'''"}-- Helper function that pre-combines display parameters into page arguments.-- Also compresses sparse arrays, as a desirable side-effect.functionp.preprocessDisplays(args,prefixes)-- Prefixes specify which parameters, in order, to check for display options-- They each have numbers auto-appended, e.g. 'label1', 'label 1', & 'l1'prefixes=prefixesordefaults.prefixeslocalindices={}localsparsePages={}fork,vinpairs(args)doiftype(k)=='number'thenindices[#indices+1]=klocaldisplayfori=1,#prefixesdodisplay=args[prefixes[i]..k]ifdisplaythenbreakendendsparsePages[k]=displayandstring.format('%s|%s',string.gsub(v,'|.*$',''),display)orvendendtable.sort(indices)localpages={}fork,vinipairs(indices)dopages[#pages+1]=sparsePages[v]endreturnpagesend--Helper function to get a page target from a processed page string--e.g. "Page|Label" → "Page" or "Target" → "Target"localfunctiongetTarget(pagename)localpipe=string.find(pagename,'|')returnstring.sub(pagename,0,pipeandpipe-1ornil)end-- Produces a labelled pages-list hatnote.-- The main frame (template definition) takes 1 or 2 arguments, for a singular-- and (optionally) plural label respectively:-- * {{#invoke:Labelled list hatnote|labelledList|Singular label|Plural label}}-- The resulting template takes pagename & label parameters normally.functionp.labelledList(frame)mArguments=require('Module:Arguments')yesno=require('Module:Yesno')locallabels={frame.args[1]ordefaults.label}labels[2]=frame.args[2]orlabels[1]labels[3]=frame.args[3]--no defaultinglabels[4]=frame.args[4]--no defaultinglocaltemplate=frame:getParent():getTitle()localargs=mArguments.getArgs(frame,{parentOnly=true})localpages=p.preprocessDisplays(args)localoptions={category=yesno(args.category),extraclasses=frame.args.extraclasses,ifexists=yesno(frame.args.ifexists),namespace=frame.args.namespaceorargs.namespace,selfref=yesno(frame.args.selfreforargs.selfref),template=template}returnp._labelledList(pages,labels,options)endlocalfunctionexists(title)localsuccess,result=pcall(function()returntitle.existsend)ifsuccessthenreturnresultelsereturntrueendendfunctionp._labelledList(pages,labels,options)ifoptions.ifexiststhenfork=#pages,1,-1do--iterate backwards to allow smooth removalslocalv=pages[k]localtitle=mw.title.new(getTarget(v),namespace)if(v=='')ortitle==nilornotexists(title)thentable.remove(pages,k)endendendlabels=labelsor{}label=(#pages==1andlabels[1]orlabels[2])ordefaults.labelfork,vinpairs(pages)doifmHatnote.findNamespaceId(v)~=0thenlabel=(#pages==1and(labels[3]orlabels[1]ordefaults.label)or(labels[4]orlabels[2]ordefaults.label))ordefaults.labelendendif#pages==0thenifoptions.ifexiststhenmw.addWarning(string.format(msg.noOutputWarning,options.templateordefaults.template))return''elsereturnmHatnote.makeWikitextError(msg.noInputWarning,(options.templateordefaults.template)..msg.errorSuffix,options.category)endendlocaltext=string.format(options.labelFormordefaults.labelForm,label,mHatlist.andList(pages,true))localhnOptions={extraclasses=options.extraclasses,selfref=options.selfref}returnmHatnote._hatnote(text,hnOptions)endreturnp
close