Module:Excerpt slideshow/sandbox
Appearance
From Wikipedia, the free encyclopedia
This module is rated as ready for general use. It has reached a mature state, is considered relatively stable and bug-free, and may be used wherever appropriate. It can be mentioned on help pages and other Wikipedia resources as an option for new users. To minimise server load and avoid disruptive output, improvements should be developed through sandbox testing rather than repeated trial-and-error editing.
This module depends on the following other modules:
This module allows article excerpt (from Module:Excerpt) to be put into a slideshow (using Module:Random slideshow). It is intended to be used in portals.
The following templates use this module:
- {{Transclude excerpts as random slideshow }}
- {{Transclude linked excerpts as random slideshow }}
- {{Transclude list item excerpts as random slideshow }}
Tracking categories
[edit ]The following categories track use where the "Selected general articles" list is built solely from templates:
- Category:Automated portals with article list built solely from one template (population: 0)
- Category:Automated portals with article list built solely from two templates (population: 0)
- Category:Automated portals with article list built solely from three templates (population: 0)
- Usages with more than three templates are not currently tracked
Pages where the "Selected general articles" list is built from a list embeded in the portal:
- Category:Automated portals with embedded list (population: 0)
Purge this page to update the totals.
Note that the Category:Automated portals with embedded list was enabled on 19 April 2019, and it will probably take a few days for all the portal pages to update
Testcases
[edit ]The following testcase pages are available for testing changes made to this module's sandbox:
- Template:Transclude excerpts as random slideshow/testcases
- Template:Transclude linked excerpts as random slideshow/testcases
- Template:Transclude list item excerpts as random slideshow/testcases
See also
[edit ]The above documentation is transcluded from Module:Excerpt slideshow/doc. (edit | history)
Editors can experiment in this module's sandbox (edit | diff) and testcases (create) pages.
Add categories to the /doc subpage. Subpages of this module.
Editors can experiment in this module's sandbox (edit | diff) and testcases (create) pages.
Add categories to the /doc subpage. Subpages of this module.
localp={} localexcerptModule=require('Module:Excerpt/portals/sandbox') localslideshowModule=require('Module:Random slideshow/sandbox') 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/sandbox/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/sandbox/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/sandbox/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