Module:GetShortDescription/sandbox: Difference between revisions

Content deleted Content added
testing indication of wikidata fallback being the result of an explicit none
detect redirects to an #id (section/anchor); suffering from fuzzy brain right now and have no idea what to do next
 
(16 intermediate revisions by the same user not shown)
Line 1:
 
local function isEmpty(value) return value == nil or value == '' end
local getArgs = require( 'Module:Arguments' ).getArgs
local mLang = require( 'Module:Lang' )
 
local function pipedLinknotEmpty( name value) return '[[:'not .. name .. '|' .. name .. ']]'isEmpty(value) end
 
local function isNone( desc value) return typevalue:lower( desc ) == 'stringnone' and desc:match( '^[Nn]one$' ) end
 
local function isEmptyalarmingMessage(message, value preview) return value == nil or value == '' end
message = '<span style="color:#d33">[[Module:GetShortDescription]] '..message..'.</span>'
 
local function notEmpty( value ) return not isEmpty( value ) end
 
local objectify_alarm
local report_redlinks
 
local function alarmingMessage( message, preview )
message = '<span style="color:#d33">[[Module:GetShortDescription]] ' .. message .. '.</span>'
if not preview then
message = message .. '[[Category:Pages displaying alarming messages about Module:GetShortDescription]]'
if objectify_alarm then return { alarm = message } end
end
return message
Line 24 ⟶ 15:
 
-- Grammatically reasonable concatenation of possible issues into one message per problematic link target.
local function previewWarning( nameargs_name, quantity_of_things )
local message = ''
if quantity_of_things.params > 3 then
message = message .. ' with extraneous parameters'
end
if quantity_of_things.descriptions > 1 then
message = message .. ', declaring ' .. quantity_of_things.descriptions .. ' short descriptions'
end
if quantity_of_things.templates > 1 or notEmpty( message ) then
message = 'has detected that [[:' .. pipedLink( name ) args_name.. ' |' .. args_name..']] has ' ..
quantity_of_things.templates .. ' {{tlx|short description}}' .. message
mw.addWarning( alarmingMessage( message, true ) )
end
end
 
local function getWikidataDescription( nametitle, langargs, not_explicit fallback)
local wikidata_id = mw.wikibase.getEntityIdForTitle( name title)
if isEmpty( wikidata_id ) then
return nil
end
local wikidata_description, wikidata_description_lang = mw.wikibase.getDescriptionWithLang( wikidata_id )
if isEmpty( wikidata_description ) or isNone( wikidata_description ) then return nil end
return nil
if isEmpty( lang.no ) and notEmpty( wikidata_description_lang ) and wikidata_description_lang ~= 'en' then
end
wikidata_description = mLang._lang {
local result = {wikidata = wikidata_description}
if isEmpty(args.lang_no) and notEmpty(wikidata_description_lang) and wikidata_description_lang ~= 'en' then
-- According to the docs this is a possibility...
result.wikidata = require('Module:Lang')._lang{
wikidata_description_lang,
wikidata_description,
italic = langargs.italiclang_italic,
nocat = langargs.nocatlang_nocat,
size = langargs.sizelang_size,
cat = langargs.catlang_cat,
rtl = langargs.rtllang_rtl
}
end
result.fellback = fallback
if notEmpty( not_explicit ) then wikidata_description = { wikidata = wikidata_description } end
return wikidata_descriptionresult
end
 
local function getExplicitDescriptiongetShortDescriptionTemplates( name title_table)
local new_titlepage_content = mw.title.newtitle_table:getContent( name )
new_title = new_title.redirectTarget or new_title
-- Assume no content means a nonexistent title because it's cheaper than testing if it exists.
local page_content = new_title:getContent()
if isEmpty( page_content ) then
return {redlink = true}
-- Try to avoid asking if the page exists; it can be expensive.
if report_redlinks and not new_title.exists then return { redlink = true } end
return nil
end
local contents_of_all_short_description_templates = {}
-- Because there could be any number of short description templates, and not all where there should be; get all the templates.
for template in page_content:gmatch( '{%b{}}' ) do
local short_description_content = mw.ustring.match( template, '^{{%s*[Ss]hort description%s*|%s*(.-)%s*}}' )
if notEmpty( short_description_content ) then
-- Collect the contents of short description templates.
contents_of_all_short_description_templates[ #contents_of_all_short_description_templates+1 ] = short_description_content
end
-- An opportunity for efficiency gain exists - to break if another type of template is found e.g. citation templates,
-- but on an appallingly formatted page, a short description template down by the categories would likely be missed.
end
if #contents_of_all_short_description_templates < 1 then return nil end
-- Better to lower/upper the case of the possibly very long page_content or this?
local redirect_to_id = mw.ustring.match(page_content, '^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*%[%[.-#.-%]%]')
if redirect_to_id then
mw.log(redirect_to_id)
-- pass this info along
end
return contents_of_all_short_description_templates
end
 
local function getShortDescription(args_name, args_name_title_table, title, title_table, fallback)
local contents_of_all_short_description_templates = {}
local redirected
-- Check for short description templates on redirect pages.
if title ~= args_name then
contents_of_all_short_description_templates = getShortDescriptionTemplates(args_name_title_table)
if contents_of_all_short_description_templates.redlink then
return contents_of_all_short_description_templates
end
redirected = false
end
if #contents_of_all_short_description_templates < 1 then
contents_of_all_short_description_templates = getShortDescriptionTemplates(title_table)
if notEmpty(redirected) then
redirected = true
end
end
if contents_of_all_short_description_templates.redlink then
return contents_of_all_short_description_templates
end
if #contents_of_all_short_description_templates < 1 then
return nil
end
local quantity_of_things = {
templates = #contents_of_all_short_description_templates,
Line 80 ⟶ 120:
params = 0
}
local possible_short_descriptions = {}
for template_content_index, short_description_template_contents in ipairs( contents_of_all_short_description_templates ) do
-- Look through the short description templates:
for template_content_index, short_description_template_contents in ipairs(contents_of_all_short_description_templates) do
-- Split the contents at pipes and trim.
local short_description_template_params = mw.text.split( short_description_template_contents, '%s*|%s*' )
if #short_description_template_params > quantity_of_things.params then
quantity_of_things.params = #short_description_template_params
end
possible_short_descriptions[ template_content_index ] = {}
-- Look through the params:
for i, param in ipairs( short_description_template_params ) do
for i, param in ipairs(short_description_template_params) do
-- Because regular expressions haven't been invented yet...
--if ignoreparam everything== that isn'tnoreplace' aor declaration ofmw.ustring.match(param, '^2%s*=%s*noreplace$') then
-- or a short description that isn't 'none'.
if param == 'noreplace' or mw.ustring.match( param, '^2%s*=%s*noreplace$' ) then
-- Take note of 'noreplace'-ing for establishment of hierarchy later.
possible_short_descriptions[ template_content_index ].noreplace = true
else
local has_equals = param:match( '=' )
if not has_equals or param:match( '^1' ) then
-- Grab the short description.
if has_equals then param = mw.ustring.gsub( param, '^1%s*=%s*', '' ) end
-- if not isNone( param )has_equals then
param = mw.ustring.gsub(param, '^1%s*=%s*', '')
-- If we made it this far; grab the short description.
end
-- If the template has both a numbered and an unnumbered short description;
-- If the template has both a numbered and an unnumbered short description;
-- whichever comes last (ltr) will be used for the page, so overwriting works out great.
-- whichever comes last (ltr) will be used by that template, so overwriting works out great.
possible_short_descriptions[ template_content_index ].description = param
possible_short_descriptions[template_content_index].description = param
-- But we want to know the total quantity of descriptions being declared.
-- And we want to know the total quantity of descriptions being declared.
quantity_of_things.descriptions = quantity_of_things.descriptions + 1
quantity_of_things.descriptions = quantity_of_things.descriptions + 1
--end
end
end
end
end
local short_descriptions = {}
for i, possible_short_description in ipairs( possible_short_descriptions ) do
-- Look through the possible short descriptions for definite short descriptions,
-- and prepare for working out which of possibly multiple short descriptions is actually being applied for the page:
for i, possible_short_description in ipairs(possible_short_descriptions) do
if possible_short_description.description then
-- If a description is 'noreplace'-ing or 'none'; demote it.
if (possible_short_description.noreplace andor #possible_short_descriptionsisNone(possible_short_description.description)) > 1 thenand
#possible_short_descriptions > 1 then
-- But don't demote it if it's already at the bottom.
if i > 1 then
table.insert( short_descriptions, #short_descriptions, possible_short_description )
else
else short_descriptions[ #short_descriptions+1 ] = possible_short_description end
else short_descriptions[ #short_descriptions+1 ] = possible_short_description end
end
else
short_descriptions[#short_descriptions+1] = possible_short_description
end
end
end
-- Let previewWarning() work out if these numbers are bad.
previewWarning( nameargs_name, quantity_of_things )
if #short_descriptions >= 1 then return short_descriptions[ #short_descriptions ].description end
if #short_descriptions >= 1 then
-- Pop!
local short_description = short_descriptions[#short_descriptions].description
if notEmpty(short_description) then
return {explicit = short_description, fellback = fallback, redirected = redirected}
end
end
return nil
end
 
local function isSisterProjectLink( name title)
local sister_project_prefixes = {
'wiktionary', 'wikt',
Line 146 ⟶ 205:
'phabricator', 'phab'
}
local pre_colon = nametitle:match( '^(%a+):' )
if pre_colon then
for i, sister in ipairs( sister_project_prefixes ) do
if pre_colon == sister then
return true end
end
end
end
Line 155 ⟶ 216:
end
 
-- Literally testing if title_table.isRedirect can be expensive;
local function getShortDescription( args )
-- processing this way resolves (multiple) redirects without the possibly expensive check.
objectify_alarm = args.objectify_alarm
local function getTitleAndTable(orig_name)
report_redlinks = args.report_redlinks
local nametitle_table = argsmw.nametitle.new(orig_name)
title_table = title_table.redirectTarget or title_table
if isEmpty( name ) then return alarmingMessage( 'requires a page name (including namespace)' ) end
local fallbacktitle = argstitle_table.fallbackprefixedText
if title == orig_name then
if isSisterProjectLink( name ) then return fallback end
return title, title_table
local prefer = args.prefer or 'explicit'
end
local only = args.only
return getTitleAndTable(title)
local lang = {
end
italic = args.lang_italic,
 
nocat = args.lang_nocat,
local function getDescription(args)
size = args.lang_size,
cat local args_name = args.lang_cat,name
if isEmpty(args_name) then
rtl = args.lang_rtl,
return {alarm = 'requires a page name (including namespace)'}
no = args.lang_no
}end
local result
-- Keep the orginal name, cleaned up, and its title_table for later.
if only == 'explicit' then result = getExplicitDescription( name )
local args_name_title_table = mw.title.new(args_name)
elseif only == 'wikidata' then result = getWikidataDescription( name, lang )
args_name = args_name_title_table.prefixedText
elseif prefer == 'explicit' then
result = getExplicitDescription( name )
if isSisterProjectLink(args_name) then
if isEmpty( result ) then result = getWikidataDescription( name, lang, true )
return nil
elseif isNone( result ) then
end
local wikidata_description = getWikidataDescription( name, lang, true )
if notEmpty( wikidata_description ) then
local title, title_table = getTitleAndTable(args_name)
wikidata_description.none = true
result = wikidata_description
if title ~= args_name then
end
if isSisterProjectLink(title) then
return nil
end
end
elseif prefer == 'wikidata' then result = getWikidataDescription( name, lang ) or getExplicitDescription( name ) end
local only = args.only
if isNone( result ) then result = nil end
local prefer = args.prefer or 'explicit'
-- Pass args_name to getShortDescription() so previewWarning()s won't be confusing for redirects.
return result or fallback
if notEmpty(only) then
if only == 'explicit' then
return getShortDescription(args_name, args_name_title_table, title, title_table)
end
if only == 'wikidata' then
return getWikidataDescription(title, args)
end
return {alarm = 'accepts either "explicit" or "wikidata" as the value of |only='}
end
if notEmpty(prefer) then
if prefer == 'explicit' then
local short_description = getShortDescription(args_name, args_name_title_table, title, title_table)
if notEmpty(short_description) then
-- Assume a Wikidata search would be a bad idea for an assumed nonexistent title.
if short_description.redlink or (not isNone(short_description.explicit) or args.none_is_valid) then
return short_description
end
end
return getWikidataDescription(title, args, true)
end
if prefer == 'wikidata' then
return getWikidataDescription(title, args) or getShortDescription(args_name, args_name_title_table, title, title_table, true)
end
return {alarm = 'accepts either "explicit" or "wikidata" as the value of |prefer='}
end
end
 
local function main(args)
local result = getDescription(args)
if notEmpty(result) then
if result.alarm then
result.alarm = alarmingMessage(result.alarm)
end
if args.stringify then
if result.alarm then
result = result.alarm
else
result = result.explicit or result.wikidata
if args.none_is_nil and isNone(result) then
result = nil
end
end
elseif not result.alarm and args.none_is_nil then
local description = result.explicit or result.wikidata
if description and args.none_is_nil and isNone(description) then
result = nil
end
end
end
return result
end
 
local p = {}
 
function p.main( frame )
local args = require('Module:Arguments').getArgs( frame )
if isEmpty( args ) then
return alarmingMessage( 'could not getArgs' ) end-- This really would be alarming.
end
return getShortDescription( args ) or ''
return main(args)
end