local p = local excerptModule = require('Module:Excerpt')local slideshowModule = require('Module:Random slideshow')local randomModule = require('Module:Random')
local DEFAULT_LIMIT = 25 -- max number of excerpts to be shown in the slideshowlocal SOURCE_PAGES_LIMIT = 10 -- max number of pages to check for links / list items
-- begin BHG addition for tracking source pageslocal sourcepgagesused = ;local sourcepgagesusedcounter = 0;local articlelistcount = -1;-- end BHG addition for tracking source pages
function cleanupArgs(argsTable) local cleanArgs = for key, val in pairs(argsTable) do if type(val)
function isDeclined(val) if not val then return false end local declinedWords = " decline declined exclude excluded false none not no n off omit omitted remove removed " return string.find(declinedWords, ' '..val..' ', 1, true) and true or falseend
--local wikitextToHtmlList = function(wikitext, symbol, outerTag, innerTag) local listParts = for level, item in mw.ustring.gmatch('\n'..wikitext..'\n', '\n(%'..symbol..'+)(.-)%f[\n]') do table.insert(listParts,) end table.insert(listParts,) local htmlList = for i, this in ipairs(listParts) do local isFirstItem = (i
#listParts) local lastLevel = isFirstItem and or listParts[i-1]['level'] local tags if #lastLevel
--local gsubWikitextLists = 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)... return mw.ustring.gsub(wikitext, '¿¿¿%'..symbol..'[^\n]+', function(listWikitext) -- ...and then reinstate linebreaks... listWikitext = mw.ustring.gsub(listWikitext, '¿¿¿%'..symbol, '\n'..symbol) -- ...and finally do the conversion return wikitextToHtmlList(listWikitext, symbol, outerTag, innerTag) end )end
local replacePipesWithMagicword = function(t) return mw.ustring.gsub(t, '|', '')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 local processBraces = function(t) local isTable = mw.ustring.sub(mw.text.trim(t), 2, 2)
'\n' and last
'#' if isParserFunction then local frame = mw.getCurrentFrame return frame:preprocess(t) end -- else replace pipes and remove internal linebreaks return replacePipesWithMagicword(mw.ustring.gsub(t, '\n*', ))end
function makeGalleryArgs(titles, options, limit, nonRandom) local galleryArgs = local titlesSequence = local i = 1 while titles[i] do titlesSequence[i] = titles[i] i = i + 1 end local sortedTitles = nonRandom and titlesSequence or randomModule.main('array',) for _i, title in ipairs(sortedTitles) do if (#galleryArgs / 2) < limit then local excerpt = mw.text.trim(excerptModule.main(options)) if excerpt and excerpt ~= and #excerpt > 10 then -- temporarily take off the Read more... link if present readmore_start_index, readmore_end_index, readmore_text = mw.ustring.find(excerpt, "(%s*%b[])$", -350) --- Starting from end should improve efficiency. 350 characters allows for long page titles and/or a long custom label for the link if readmore_start_index then excerpt = mw.ustring.sub(excerpt, 1, readmore_start_index-1) end end if excerpt and excerpt ~= and #excerpt > 10 then -- check again in case we had a few characters plus Read more... -- strip galleries excerpt = mw.ustring.gsub(excerpt, "<%s*[Gg]allery.->.-<%s*/%s*[Gg]allery%s*>", "") -- strip tables and block templates; strip newlines and replace pipes within inline templates excerpt = mw.ustring.gsub(excerpt..'\n', '\n?%b\n?', processBraces) -- replace pipes within links excerpt = mw.ustring.gsub(excerpt, '%b[]', replacePipesWithMagicword) -- replace other pipes with html entity excerpt = mw.ustring.gsub(excerpt, '|', '|') -- 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) -- add back the "Read more..." link if it was present if readmore_text then excerpt = excerpt .. readmore_text end local text = '
' .. mw.ustring.gsub(excerpt, '%c', '
') .. '
' table.insert(galleryArgs, 'File:Blank.png') table.insert(galleryArgs, text) end end end if nonRandom then galleryArgs.random = 'false' end if #galleryArgs
local makeOptions = function(args) local options = args -- pick up miscellaneous options: more, errors, fileargs options.paraflags = excerptModule.numberflags(args.paragraphs or "") -- parse paragraphs, e.g. "1,3-5" → options.fileflags = excerptModule.numberflags(args.files or "") -- parse file numbers if args.nostubs and isDeclined(args.nostubs) then options.nostubs = false else options.nostubs = true end return optionsend
local isArticle = function(pagetitle) local titleObject = mw.title.new(pagetitle) return (titleObject and titleObject.namespace
local getLinkedTitles = function(args, method, limit) local pagenames = local ii = 1 local isNotCategory while args[ii] and ii < limit do local pageContent = excerptModule.getContent(args[ii]) if pageContent then local pageSection = args["section"..ii] or args["section"] local sectionOnly = args["sectiononly"..ii] or args["sectiononly"] local text = pageContent if pageSection then -- check relevant section only text = excerptModule.getsection(pageContent, pageSection, sectionOnly) or pageContent end -- replace annotated links with real links text = mw.ustring.gsub(text, "", "%1") if method
*See also.*", "") for p in mw.ustring.gmatch(text, "\n:*[%*#][^\n]-%[%[%s*([^%]|\n]*)") do if isArticle(p) then table.insert(pagenames, p) end end end -- begin BHG addition for tracking source pages if ((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 return pagenamesend
-- Template entry points:
-- randomExcerpt: Titles specified in template parameters (equivalent to)p.randomExcerpt = function(frame) local parent = frame.getParent(frame) local output = p._excerpt(parent.args, 'random') return frame:preprocess(output)end
-- linkedExcerpt: Titles from links on one or more pages (similar to)p.linkedExcerpt = function(frame) local parent = frame.getParent(frame) local output = p._excerpt(parent.args, 'linked') return frame:preprocess(output)end
-- listItemExcerpt: Titles from linked list items one one or more pages (similar to)p.listItemExcerpt = function(frame) local parent = frame.getParent(frame) local output = p._excerpt(parent.args, 'listitem') return frame:preprocess(output)end
-- Module entry point:
p._excerpt = function(_args, method) local args = cleanupArgs(_args) -- check for blank value in more parameter if _args.more and not args.more then args.more = "Read more..." -- default text for blank more= end local galleryArgs = local options = makeOptions(args) local limit = args.limit and tonumber(args.limit) or DEFAULT_LIMIT local titles if method
'listitem' then titles = getLinkedTitles(args, method, SOURCE_PAGES_LIMIT) else titles = args end local galleryArgs = makeGalleryArgs(titles, options, limit, isDeclined(_args.random)) return slideshowModule._main(galleryArgs, false, 'excerptSlideshow-container') .. checksourcepagesend
-- begin BHG addition for tracking source pagesfunction checksourcepages local pagecounter = 0; local templatecount = 0; local retval =""; local debugging = false; if debugging then retval = '
\n----\n' retval = retval .. "sourcepgagesusedcounter: " .. sourcepgagesusedcounter .. "\n----\n" retval = retval .. "pages used:" end local apage for apage in arrayvalues(sourcepgagesused) do if debugging then retval = retval .. "\n# " retval = retval .. " — " .. "First 999 = /" .. string.sub(apage, 1, 999) .. "/" end if (string.find(apage, "^[tT]emplate ?:")
" end -- first do a sanity check that both counting methods have produced the same result if (sourcepgagesusedcounter
templatecount) then if (templatecount
2) then retval = retval .. "" end end end if (articlelistcount < 2) then retval = retval .. "" elseif (articlelistcount <= 5) then retval = retval .. "" elseif (articlelistcount <= 10) then retval = retval .. "" elseif (articlelistcount <= 15) then retval = retval .. "" elseif (articlelistcount <= 20) then retval = retval .. "" elseif (articlelistcount <= 25) then retval = retval .. "" elseif (articlelistcount <= 30) then retval = retval .. "" elseif (articlelistcount <= 40) then retval = retval .. "" elseif (articlelistcount <= 50) then retval = retval .. "" elseif (articlelistcount <= 100) then retval = retval .. "" elseif (articlelistcount <= 200) then retval = retval .. "" elseif (articlelistcount <= 500) then retval = retval .. "" elseif (articlelistcount > 500) then retval = retval .. "" endretval = retval .. "" return retvalend
function arrayvalues(t) local i = 0 return function i = i + 1; return t[i] endend
-- end BHG addition for tracking source pagesreturn p