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.
localmHatnote=require('Module:Hatnote') localp={} --Collates key-based table of classes into usable class list functioncollateClassList(listTable) locallist={} fork,vinpairs(listTable)do ifvandtype(k)=="string"thentable.insert(list,k)end end returntable.concat(list," ") end --Passes through single argument from parent frame functionp.group(frame) returnp._group(frame:getParent().args[1],frame:getParent().args.category) end functionp._group(inputText,category) --If there's an error element, pass everything through unchanged for easier --error resolution ifstring.find(inputText,'<%a- class="error"',1,true)thenreturninputTextend --Heavily reused hatnote data capture pattern localdefaultClasses='hatnote navigation%-not%-searchable' --string.gsub(mHatnote.defaultClasses(false), "%-", "%%-") --TODO replace hardcoded classes with function call once available localhatnotePattern= '(<div role="note" class="'.. string.gsub(mHatnote.defaultClasses(false),"%-","%%-").. '%s?(.-)">(.-)</div>)' --Capture hatnote divs and "loose" categories; we'll ignore everything else localrawDivs={} locallooseCategories='' forxinstring.gmatch(inputText,hatnotePattern)do table.insert(rawDivs,x) end forxinstring.gmatch(inputText,'%[%[Category:.-%]%]')do looseCategories=looseCategories..x end --if no inner hatnotes, return an error ifnotrawDivs[1]then returnmHatnote.makeWikitextError( 'no inner hatnotes detected', 'Template:Hatnote group', category ) end --Preprocess divs into strings and classes localinnerHatnotes={} fork,vinpairs(rawDivs)do row={} row.text=string.gsub(v,hatnotePattern,'%3') --Here we set class names as keys for easier intersection later row.classes={} form,winipairs( mw.text.split( string.gsub(v,hatnotePattern,'%2'), ' ', true ) )do row.classes[mw.text.trim(w)]=true end table.insert(innerHatnotes,row) end --Identify any universal classes ("hatnote" ignored by omission earlier) localuniversalClasses={} --clone first classes table to force passing by value rather than reference fork,vinpairs(innerHatnotes[1].classes)douniversalClasses[k]=vend fork,vinipairs(innerHatnotes)do form,winpairs(universalClasses)do universalClasses[m]=(universalClasses[m]andv.classes[m]) end end --Remove universal classes from div items, then create class strings per row fork,vinipairs(innerHatnotes)do form,winpairs(v.classes)do ifuniversalClasses[m]thenv.classes[m]=nilend end v.classString=collateClassList(v.classes) end --Process div items into classed span items localinnerSpans={} fork,vinipairs(innerHatnotes)do table.insert( innerSpans, tostring( mw.html.create("span") :addClass(v.classString~=''andv.classStringornil) :wikitext(v.text) ) ) end --Concatenate spans and categories, and return wrapped as a single hatnote localoutputText=table.concat(innerSpans," ")..looseCategories localhnOptions={extraclasses=collateClassList(universalClasses)} returnmHatnote._hatnote(outputText,hnOptions) end returnp