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={} localexcerptModule=require('Module:Excerpt/portals') localslideshowModule=require('Module:Random slideshow') localrandomModule=require('Module:Random') localDEFAULT_LIMIT=25-- max number of excerpts to be shown in the slideshow localSOURCE_PAGES_LIMIT=10-- max number of pages to check for links / list items -- begin BHG addition for tracking source pages localsourcepgagesused={}; localsourcepgagesusedcounter=0; localarticlelistcount=-1; localusesEmbeddedList=false; -- end BHG addition for tracking source pages functioncleanupArgs(argsTable) localcleanArgs={} forkey,valinpairs(argsTable)do iftype(val)=='string'then val=val:match('^%s*(.-)%s*$') ifval~=''then cleanArgs[key]=val end else cleanArgs[key]=val end end returncleanArgs end functionisDeclined(val) ifnotvalthenreturnfalseend localdeclinedWords=" decline declined exclude excluded false none not no n off omit omitted remove removed " returnstring.find(declinedWords,' '..val..' ',1,true)andtrueorfalse end --[[ @param {String} wikitext: Wikitext of just the list (i.e. each line is a list item) @param {String} symbol: Special character used in the wikitext markup for the list, e.g. '*' or '#' @param {String} outerTag: Text portion of the tag for each list or sublist, e.g. 'ul' or 'ol' @param {String} innerTag: Text portion of the tag for each list item, e.g. 'li' ]] localwikitextToHtmlList=function(wikitext,symbol,outerTag,innerTag) locallistParts={} forlevel,iteminmw.ustring.gmatch('\n'..wikitext..'\n','\n(%'..symbol..'+)(.-)%f[\n]')do table.insert(listParts,{level=level,item=item}) end table.insert(listParts,{level='',item=''}) localhtmlList={} fori,thisinipairs(listParts)do localisFirstItem=(i==1) localisLastItem=(i==#listParts) locallastLevel=isFirstItemand''orlistParts[i-1]['level'] localtags if#lastLevel==#this.levelthen tags='</'..innerTag..'><'..innerTag..'>' elseif#this.level>#lastLevelthen tags=string.rep('<'..outerTag..'><'..innerTag..'>',#this.level-#lastLevel) elseifisLastItemthen tags=string.rep('</'..innerTag..'></'..outerTag..'>',#lastLevel) else-- ( #this.level < #lastLevel ) and not last item tags=string.rep('</'..innerTag..'></'..outerTag..'>',#lastLevel-#this.level)..'</'..innerTag..'><'..innerTag..'>' end table.insert(htmlList,tags..this.item) end returntable.concat(htmlList) end --[[ @param {String} wikitext: Wikitext excertp containg zero or more lists @param {String} symbol: Special character used in the wikitext markup for the list, e.g. '*' or '#' @param {String} outerTag: Text portion of the tag for each list or sublist, e.g. 'ul' or 'ol' @param {String} innerTag: Text portion of the tag for each list item, e.g. 'li' ]] localgsubWikitextLists=function(wikitext,symbol,outerTag,innerTag) -- temporarily remove list linebreaks... wikitext=mw.ustring.gsub(wikitext..'\n','\n%'..symbol,'¿¿¿'..symbol) -- ...so we can grab the whole list (and just the list)... returnmw.ustring.gsub( wikitext, '¿¿¿%'..symbol..'[^\n]+', function(listWikitext) -- ...and then reinstate linebreaks... listWikitext=mw.ustring.gsub(listWikitext,'¿¿¿%'..symbol,'\n'..symbol) -- ...and finally do the conversion returnwikitextToHtmlList(listWikitext,symbol,outerTag,innerTag) end ) end --[[ help gsub strip tables and templates that aren't part of the prose, and remove linebreaks from within other templates, and preprocess parser functions ]] localprocessBraces=function(t) localisTable=mw.ustring.sub(mw.text.trim(t),2,2)=='|' ifisTablethen return'' end -- else it's a template or parser function localfirst=mw.ustring.sub(t,1,1) locallast=mw.ustring.sub(t,-1) localisNotPartOfProse=first=='\n'andlast=='\n' ifisNotPartOfProsethen return'' end localisParserFunction=mw.ustring.sub(mw.text.trim(t),3,3)=='#' ifisParserFunctionthen localframe=mw.getCurrentFrame() returnframe:preprocess(t) end -- else remove internal linebreaks returnmw.ustring.gsub(t,'\n*','') end localcleanUpExcerpt=function(excerpt) -- strip galleries excerpt=mw.ustring.gsub(excerpt,"<%s*[Gg]allery.->.-<%s*/%s*[Gg]allery%s*>","") -- strip tables and block templates; strip newlines excerpt=mw.ustring.gsub(excerpt..'\n','\n?%b{}\n?',processBraces) -- replace wikitext bulleted lists with html bulleted lists excerpt=gsubWikitextLists(excerpt,'*','ul','li') -- replace wikitext numbered lists with html numbered lists excerpt=gsubWikitextLists(excerpt,'#','ol','li') excerpt=mw.text.trim(excerpt) returnexcerpt end functionmakeGalleryArgs(titles,options,limit,nonRandom) localgalleryArgs={} localtitlesSequence={} locali=1 whiletitles[i]do titlesSequence[i]=titles[i] i=i+1 end localsortedTitles=nonRandomandtitlesSequenceorrandomModule.main('array',{t=titlesSequence,limit=limit}) for_i,titleinipairs(sortedTitles)do if(#galleryArgs/2)<limitthen localsuccess,excerpt=pcall(excerptModule.get,title,options) ifnotsuccessthen mw.log("require('Module:Excerpt').get failed: "..excerpt)-- probably got a redlink excerpt=nil end ifexcerptandexcerpt~=''and#excerpt>10then-- check again in case we had a few characters plus (Full article...) excerpt=cleanUpExcerpt(excerpt) ifoptions.morethen excerpt=excerpt.." ('''[["..title.."|"..options.more.."]]''')" end localtext='<div style="text-align:left;">'..mw.ustring.gsub(excerpt,'%c','<br>')..'</div>' table.insert(galleryArgs,'File:Blank.png') table.insert(galleryArgs,text) end end end ifnonRandomthen galleryArgs.random='false' end if#galleryArgs==0andoptions.nostubsthen -- try again, this time including stubs options.nostubs=false returnmakeGalleryArgs(titles,options,limit,nonRandom) else returngalleryArgs end end localmakeOptions=function(args) localoptions=args-- pick up miscellaneous options: more, errors, fileargs options.paraflags=excerptModule.numberFlags(args.paragraphsor"")-- parse paragraphs, e.g. "1,3-5" → {"1","3-5"} options.fileflags=excerptModule.numberFlags(args.filesor"")-- parse file numbers options.ignoreOnlyincludes=options.ignoreOnlyincludes==nilandtrueoroptions.ignoreOnlyincludes-- default to true ifargs.nostubsandisDeclined(args.nostubs)then options.nostubs=false else options.nostubs=true end returnoptions end localisArticle=function(pagetitle) localtitleObject=mw.title.new(pagetitle) return(titleObjectandtitleObject.namespace==0)andtrueorfalse end localgetLinkedTitles=function(args,method,limit) localpagenames={} localii=1 localisNotCategory whileargs[ii]andii<limitdo localpageContent=excerptModule.getContent(args[ii]) ifpageContentthen localpageSection=args["section"..ii]orargs["section"] localsectionOnly=args["sectiononly"..ii]orargs["sectiononly"] localtext=pageContent ifpageSectionthen-- check relevant section only localsuccess,result=pcall(excerptModule.getSection,pageContent,pageSection,sectionOnly) ifnotsuccessthen mw.log("require('Module:Excerpt').getSection failed on the content of "..args[ii]..": "..result) result=nil end text=resultorpageContent end -- begin BHG addition for tracking source pages localthisPage=mw.title.getCurrentTitle().nsText..":"..mw.title.getCurrentTitle().text thisPage=thisPage:gsub('_',' ')-- fix the nsText part, until [[phab:T369784]] is resolved localthisBareParam=mw.ustring.gsub(args[ii],"^([^#]+).*$","%1",1)-- strip any section anchor from the parameter's page name thisBareParam=thisBareParam:gsub('_',' ')-- support underscores in parameter's page name if(thisPage==thisBareParam)then usesEmbeddedList=true; end -- end BHG addition for tracking source pages -- replace annotated links with real links text=mw.ustring.gsub(text,"{{%s*[Aa]nnotated[ _]link%s*|%s*(.-)%s*}}","[[%1]]") ifmethod=="linked"then forpinmw.ustring.gmatch(text,"%[%[%s*([^%]|\n]*)")do ifisArticle(p)then table.insert(pagenames,p) end end else -- listitem: first wikilink on a line beginning *, :#, etc. except in "See also" or later section text=mw.ustring.gsub(text,"\n== *See also.*","") forpinmw.ustring.gmatch(text,"\n:*[%*#][^\n]-%[%[%s*([^%]|\n]*)")do ifisArticle(p)then table.insert(pagenames,p) end end end -- begin BHG addition for tracking source pages if((method=="listitem")or(method=="linked"))then table.insert(sourcepgagesused,args[ii]) sourcepgagesusedcounter=sourcepgagesusedcounter+1 end -- end BHG addition for tracking source pages end ii=ii+1 end -- begin BHG addition for tracking articlelistcount=#pagenames -- end BHG addition for tracking returnpagenames end -- Template entry points: -- randomExcerpt: Titles specified in template parameters (equivalent to {{Transclude random excerpt}}) p.randomExcerpt=function(frame) localparent=frame.getParent(frame) localoutput=p._excerpt(parent.args,'random') returnframe:extensionTag{name='templatestyles',args={src='Module:Random slideshow/styles.css'}} ..frame:preprocess(output) end -- linkedExcerpt: Titles from links on one or more pages (similar to {{Transclude linked excerpt}}) p.linkedExcerpt=function(frame) localparent=frame.getParent(frame) localoutput=p._excerpt(parent.args,'linked') returnframe:extensionTag{name='templatestyles',args={src='Module:Random slideshow/styles.css'}} ..frame:preprocess(output) end -- listItemExcerpt: Titles from linked list items one one or more pages (similar to {{Transclude list item excerpt}}) p.listItemExcerpt=function(frame) localparent=frame.getParent(frame) localoutput=p._excerpt(parent.args,'listitem') returnframe:extensionTag{name='templatestyles',args={src='Module:Random slideshow/styles.css'}} ..frame:preprocess(output) end -- Module entry point: p._excerpt=function(_args,method) localargs=cleanupArgs(_args) args.more=excerptModule.getMoreLinkText(_args.more) localoptions=makeOptions(args) locallimit=args.limitandtonumber(args.limit)orDEFAULT_LIMIT localtitles ifmethod=='linked'ormethod=='listitem'then titles=getLinkedTitles(args,method,SOURCE_PAGES_LIMIT) else titles=args end localgalleryArgs=makeGalleryArgs(titles,options,limit,isDeclined(_args.random)) returnslideshowModule._main(galleryArgs,false,'excerptSlideshow-container')..checksourcepages() end p._cleanUpExcerpt=cleanUpExcerpt -- begin BHG addition for tracking source pages functionchecksourcepages() -- no tracking unless we are in Portal namespace if(mw.title.getCurrentTitle().nsText~="Portal")then return"" end localpagecounter=0; localtemplatecount=0; localoutlinecount=0; localretval=""; localusesEponymousArticle=false; localdebugging=false; localthisPageBareName=mw.title.getCurrentTitle().text; ifdebuggingthen retval='<div style="display:block; border:10px solid green; background-color:#efe; padding:1em; margin:1em">\n----\n' retval=retval.."sourcepgagesusedcounter: "..sourcepgagesusedcounter.."\n----\n" retval=retval.."pages used:" end localapage forapageinarrayvalues(sourcepgagesused)do ifdebuggingthen retval=retval.."\n# [[:"..apage.."]]" retval=retval.." — ".."First 999 = /"..string.sub(apage,1,999).."/" end if(string.find(apage,"^[tT]emplate ?:")==1)then templatecount=templatecount+1; end if(string.find(apage,"^[oO]utline +of ")==1)then outlinecount=outlinecount+1; end if(apage==thisPageBareName)then usesEponymousArticle=true; end pagecounter=pagecounter+1 end ifdebuggingthen retval=retval.."\nTotal pages: "..pagecounter retval=retval.."\ntemplatecount: "..templatecount retval=retval.."</div>" end -- first do a sanity check that both counting methods have produced the same result if(sourcepgagesusedcounter==pagecounter)then -- if all pages are templates, then populate tracking categories if(pagecounter==templatecount)then if(templatecount==1)then retval=retval.."[[Category:Automated article-slideshow portals with article list built solely from one template]]" elseif(templatecount==2)then retval=retval.."[[Category:Automated article-slideshow portals with article list built solely from two templates]]" elseif(templatecount==3)then retval=retval.."[[Category:Automated article-slideshow portals with article list built solely from three templates]]" elseif(templatecount>3)then retval=retval.."[[Category:Automated article-slideshow portals with article list built solely from four or more templates]]" end elseif(templatecount>0)then retval=retval.."[[Category:Automated article-slideshow portals with article list built using one or more templates, and other sources]]" end end if(outlinecount>=1)then retval=retval.."[[Category:Automated article-slideshow portals with article list built using one or more outline pages]]" end if(articlelistcount<2)then retval=retval.."[[Category:Automated article-slideshow portals with less than 2 articles in article list]]" elseif(articlelistcount<=5)then retval=retval.."[[Category:Automated article-slideshow portals with 2–5 articles in article list]]" elseif(articlelistcount<=10)then retval=retval.."[[Category:Automated article-slideshow portals with 6–10 articles in article list]]" elseif(articlelistcount<=15)then retval=retval.."[[Category:Automated article-slideshow portals with 11–15 articles in article list]]" elseif(articlelistcount<=20)then retval=retval.."[[Category:Automated article-slideshow portals with 16–20 articles in article list]]" elseif(articlelistcount<=25)then retval=retval.."[[Category:Automated article-slideshow portals with 21–25 articles in article list]]" elseif(articlelistcount<=30)then retval=retval.."[[Category:Automated article-slideshow portals with 26–30 articles in article list]]" elseif(articlelistcount<=40)then retval=retval.."[[Category:Automated article-slideshow portals with 31–40 articles in article list]]" elseif(articlelistcount<=50)then retval=retval.."[[Category:Automated article-slideshow portals with 41–50 articles in article list]]" elseif(articlelistcount<=100)then retval=retval.."[[Category:Automated article-slideshow portals with 51–100 articles in article list]]" elseif(articlelistcount<=200)then retval=retval.."[[Category:Automated article-slideshow portals with 101–200 articles in article list]]" elseif(articlelistcount<=500)then retval=retval.."[[Category:Automated article-slideshow portals with 201–500 articles in article list]]" elseif(articlelistcount<=1000)then retval=retval.."[[Category:Automated article-slideshow portals with 501–1000 articles in article list]]" elseif(articlelistcount>1000)then retval=retval.."[[Category:Automated article-slideshow portals with over 1000 articles in article list]]" end ifusesEmbeddedListthen retval=retval.."[[Category:Automated article-slideshow portals with embedded list]]" end ifusesEponymousArticlethen retval=retval.."[[Category:Automated article-slideshow portals with article list built using eponymous article]]" end returnretval end functionarrayvalues(t) locali=0 returnfunction()i=i+1;returnt[i]end end -- end BHG addition for tracking source pages returnp