Anda dapat membuat halaman dokumentasi untuk buat pada modul Scribunto ini.
Penyunting dapat melakukan uji coba pada halaman bak pasir (buat | cermin) dan kasus uji (buat) modul ini.
Subhalaman modul ini.
Penyunting dapat melakukan uji coba pada halaman bak pasir (buat | cermin) dan kasus uji (buat) modul ini.
Subhalaman modul ini.
localp={} localspecialParams={ ['$params']='all parameters', ['$extra']='extra parameters', ['$set1']='parameter set 1', ['$set2']='parameter set 2', ['$set3']='parameter set 3', ['$aliases']='parameter aliases', ['$indent']='indent', ['$flags']='flags', ['$B']='template content' } p['']=function(frame) ifnotframe:getParent()then error('{{#invoke:Unsubst-infobox|}} makes no sense without a parent frame') end ifnotframe.args['$B']then error('{{#invoke:Unsubst-infobox|}} requires parameter $B (template content)') end ifnotframe.args['$params']then error('{{#invoke:Unsubst-infobox|}} requires parameter $params (parameter list)') end ifmw.isSubsting()then ---- substing -- Combine passed args with passed defaults localargs={} ifstring.find(','..(frame.args['$flags']or'')..',',',%s*override%s*,')then fork,vinpairs(frame:getParent().args)do args[k]=v end fork,vinpairs(frame.args)do ifnotspecialParams[k]then ifv=='__DATE__'then v=mw.getContentLanguage():formatDate('F Y') end args[k]=v end end else fork,vinpairs(frame.args)do ifnotspecialParams[k]then ifv=='__DATE__'then v=mw.getContentLanguage():formatDate('F Y') end args[k]=v end end fork,vinpairs(frame:getParent().args)do args[k]=v end end -- Build an equivalent template invocation -- First, find the title to use localtitleobj=mw.title.new(frame:getParent():getTitle()) localtitle iftitleobj.namespace==10then-- NS_TEMPLATE title=titleobj.text elseiftitleobj.namespace==0then-- NS_MAIN title=':'..titleobj.text else title=titleobj.prefixedText end -- Remove empty fields fork,vinpairs(args)do ifv==''thenargs[k]=nilend end -- Pull information from parameter aliases localaliases={} ifframe.args['$aliases']then locallist=mw.text.split(frame.args['$aliases'],'%s*,%s*') fork,vinipairs(list)do localtmp=mw.text.split(v,'%s*>%s*') aliases[(tonumber(mw.ustring.match(tmp[1],'^[1-9][0-9]*$')))ortmp[1]]=((tonumber(mw.ustring.match(tmp[2],'^[1-9][0-9]*$')))ortmp[2]) end end fork,vinpairs(aliases)do ifargs[k]andnotargs[v]thenargs[v],args[k]=args[k],nilend end -- Build the invocation body with numbered args first, then named localret='{{'..title fork,vinipairs(args)do ifmw.ustring.find(v,'=',1,true)then -- likely something like 1=foo=bar, we need to do it as a named arg break end ifnotaliases[k]then ret=ret..'|'..v args[k]=nil end end -- Pull lists from special parameters localparams=mw.text.split(frame.args['$params'],'%s*,%s*') fork,vinipairs(params)do params[k]=(tonumber(mw.ustring.match(v,'^[1-9][0-9]*$')))orv end localsets,setparams,extra={{},{},{}},{},{} fork=1,3do localv=frame.args['$set'..k] ifvthen setparams[k]=mw.text.split(v,'%s*,%s*') forx,yinipairs(setparams[k])do setparams[k][x]=(tonumber(mw.ustring.match(y,'^[1-9][0-9]*$')))ory sets[k][setparams[k][x]]=true end end end ifframe.args['$extra']then localtmp=mw.text.split(frame.args['$extra'],'%s*,%s*') fork,vinipairs(tmp)doextra[(tonumber(mw.ustring.match(v,'^[1-9][0-9]*$')))orv]=trueend end -- Replace parameter list with short version if full version not necessary localtmp={} fork,vinipairs(sets)do ifnext(v)then-- if table v is not empty for_,xinipairs(params)do ifargs[x]andnotv[x]then tmp[k]=true break end end ifnottmp[k]thenparams=setparams[k]end end end -- Align parameters correctly and remove extra ones localmaxlength=0 localdiscard={} fork,vinipairs(params)do if(notextra[v])orargs[v]then localtmp=mw.ustring.len(tostring(v)) iftmp>maxlengththenmaxlength=tmpend else table.insert(discard,1,k) end end fork,vinipairs(discard)dotable.remove(params,v)end localindent=string.rep(' ',(tonumber(frame.args['$indent'])or0)) localspace,newline=' ','\n' ifnotnext(params)thenspace,newline='',''end fork,vinipairs(params)do localtmp=space ifmw.ustring.match(mw.ustring.sub((args[v]or'')..' ',1,1),'[%*:;#]')thentmp='\n'end ret=ret..newline..indent..'|'..space..v..string.rep(' ',(maxlength-mw.ustring.len(v)))..space..'='..tmp..(args[v]or'') end ret=ret..newline..'}}' ret=mw.ustring.gsub(ret,'%s+\n','\n') returnret else -- Not substing -- Just return the "body" returnframe.args['$B'] end end returnp