Jump to content

Module:Sandbox/Fred Gandt

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Fred Gandt (talk | contribs) at 06:27, 24 January 2023 (weird bug? non-greedy match capture fail: desc = ' 1 = Thing that is a thing '; desc_cap = string.match( desc, '%s*1%s*=%s*(.-)%s*' ) returns an empty string). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

local p = {}

local mLang = require( 'Module:Lang' )

local function errorMessage( message )
	return '<strong class="error">ERROR with invocation of [[Module:User:Fred Gandt]]: ' .. message .. '</strong>'
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
	return  mLang._lang {
		wikidata_description_lang,
		wikidata_description,
		italic = lang.italic or '',
		nocat = lang.nocat or '',
		size = lang.size or '',
		cat = lang.cat or '',
		rtl = lang.rtl or ''
	}
end

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#', { only = 'templates', categories = 0, references = 0, files = 0, templates = '[Ii]nfobox' } )
	--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', { only = 'templates', categories = 0, references = 0, files = 0, templates = '[Ii]nfobox' } )
	--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 {{cite*}}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', { only = 'templates', categories = 0, references = 0, files = 0, templates = '-[Cc]ite' } )
	--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
	
	--[[
	
	local current_title_lead_infobox = getTransclusion( tostring( current_title ), { only = 'templates' } )
	if not current_title_lead_infobox then
		return nil
	end
	current_title_lead_infobox = mw.text.trim( current_title_lead_infobox )
	if not current_title_lead_infobox or current_title_lead_infobox == '' then
		return nil
	end
	local current_frame = mw.getCurrentFrame()
	if not current_frame then
		return errorMessage( 'could not getCurrentFrame' )
	end
	local preprocessed_current_title_lead_infobox = current_frame:preprocess( current_title_lead_infobox )
	if not preprocessed_current_title_lead_infobox then
		return errorMessage( 'could not preprocess current_title_lead_infobox' )
	end
	-- <div class="shortdescription nomobile noexcerpt noprint searchaux" style="display:none">19th episode of the 7th season of Star Trek: Voyager</div>
	-- right at the start too :)
	return mw.text.nowiki( preprocessed_current_title_lead_infobox )
	
	--]]
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, '{{%s*[Ss]hort description%s*|.-}}' )
	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.fallback
end

function p.main( frame )
	local args = frame.args
	local result = getShortDescription( args ) or ''
	mw.log( result )
	return result
end

function p.test( frame )
	local args = frame.args
	
	local page_content = 'akhfkafjn wakakjdb {{ short description | 2= noreplace|pagetype =Redirect | 1 = Thing that is a thing }} afhbajkdb ksjabkabd'
	local short_description_content = string.match( page_content, '{{%s*[Ss]hort description%s*|%s*([^}]-)%s*}}' )
	mw.log( short_description_content )
	local short_description_params = mw.text.split( short_description_content, '%s*|%s*' )
	mw.logObject( short_description_params )
	
	for key, param in ipairs( short_description_params ) do
		local description = string.match( param, '1%s*=%s*(.+)' )
		if description then
			mw.log( description )
			break
		end
	end
	
end

return p