Module:Sandbox/Fred Gandt/sandbox explained

local p =

local getArgs = require('Module:Arguments').getArgs

local function errorMessage(message) return 'ERROR with invocation of : ' .. message .. ''end

local function getWikidataDescription(name, lang) local wikidata_id = mw.wikibase.getEntityIdForTitle(name) if not wikidata_id then return nil end local wikidata_description, wikidata_description_lang = mw.wikibase.getDescriptionWithLang(wikidata_id) if not wikidata_description then return nil end if lang.no or wikidata_description_lang

'en' then return wikidata_description end if not wikidata_description_lang then return nil end local current_frame = mw.getCurrentFrame if not current_frame then return errorMessage('could not getCurrentFrame') end local non_english_wikidata_description = current_frame:expandTemplate if not non_english_wikidata_description then return errorMessage('could not expandTemplate lang') end return non_english_wikidata_descriptionend

local function getImplicitDescription --for m in string.gmatch('string', 'pattern') do mw.log(m) end -- --local current_title = mw.title.getCurrentTitle if not current_title then return errorMessage('could not getCurrentTitle') end -- -- let's assume that implicit descriptions will generally be set by infoboxes, but could be from anywhere -- it would therefore makes sense to cycle through any infoboxes first --get the lead infoboxes (there might be none or many) first, since they're the most likely to place any implicit description --since we will be preprocessing them, strip a bunch of stuff we definitely don't need or want --being infoboxes; there SHOULD be no references, but since when did that stop anyone? -_- --local lead_infoboxes = getTransclusion('The Partisan#',) --mw.log(lead_infoboxes) --split the results, and loop through them --preprocess and check for a description match --if we get a hit; return the description -- if we didn't get a hit... --get any remaining infoboxes; multiple infoboxes is unusual, but this will unfortunately get the lead infobox again if there is one --why not just do this first? because it's much more expensive and a lot less likely to be useful --again; strip the stuff we don't need or want --local all_infoboxes = getTransclusion('The Partisan',) --mw.log(all_infoboxes) --split the results --obviously, we don't want to preprocess the same infobox again, so ignore it --if there are any more, loop through them --preprocess and check for a description match --if we get a hit; return the description -- if they weren't helpful, it's probably a good idea to stop doing this, but if you insist... --get all templates that aren't s; it would be nice to not get infoboxes too, but that doesn't seem possible --again; strip the stuff we don't need or want --local all_other_templates = getTransclusion('The Partisan',) --mw.log(all_other_templates) --split the results --obviously, we don't want to preprocess the infoboxes again, so ignore them --if there are any more, loop through them --preprocess and check for a description match --if we get a hit; return the description -- if they didn't spit one out, we consider ourselves lucky to have survived -- NOTE: if there are multiple implicit descriptions being set, it's theoretically possible we could find one that's redundant -- I have zero intention to address this possibility --end

local function getExplicitDescription(name) local page_content = mw.title.new(name):getContent if not page_content then return errorMessage('could not getContent') end local short_description_template = string.match(page_content, '') if not short_description_template then return nil end local current_frame = mw.getCurrentFrame if not current_frame then return errorMessage('could not getCurrentFrame') end local preprocessed_short_description_template = current_frame:preprocess(short_description_template) if not preprocessed_short_description_template then return errorMessage('could not preprocess short_description_template') end return string.match(preprocessed_short_description_template, '>%s*(.-)%s*<')end

local function getShortDescription(args) local name = args.name if not name then return errorMessage('a page name (including namespace) MUST be provided') end local result local only = args.only local prefer = args.prefer or 'explicit' local lang = lang.italic = args.lang_italic lang.nocat = args.lang_nocat lang.size = args.lang_size lang.cat = args.lang_cat lang.rtl = args.lang_rtl lang.no = args.lang_no if only

'explicit' then result = getExplicitDescription(name) elseif only

'wikidata' then result = getWikidataDescription(name, lang) elseif prefer

'explicit' then result = getExplicitDescription(name) or getWikidataDescription(name, lang) elseif prefer

'wikidata' then result = getWikidataDescription(name, lang) or getExplicitDescription(name) end return result or args.fallbackend

function p.main(frame) local args = getArgs(frame.args) if not args then return errorMessage('could not getArgs') end local result = getShortDescription(args) or mw.log(result) return resultend

return p