stringtranslate.com

Module:GetShortDescription

local function isEmpty(value) return value == nil or value == '' endlocal function notEmpty(value) return not isEmpty(value) endlocal function isNone(value) return value:lower() == 'none' endlocal function alarmingMessage(message, preview)message = '<span style="color:#d33">[[Module:GetShortDescription]] '..message..'.</span>'if not preview thenmessage = message..'[[Category:Pages displaying alarming messages about Module:GetShortDescription]]'endreturn messageend-- Grammatically reasonable concatenation of possible issues into one message per problematic link target.local function previewWarning(args_name, quantity_of_things)local message = ''if quantity_of_things.params > 3 thenmessage = message..' with extraneous parameters'endif quantity_of_things.descriptions > 1 thenmessage = message..', declaring '..quantity_of_things.descriptions..' short descriptions'endif quantity_of_things.templates > 1 or notEmpty(message) thenmessage = 'has detected that [[:'..args_name..'|'..args_name..']] has '..quantity_of_things.templates..' {{tlx|short description}}'..messagemw.addWarning(alarmingMessage(message, true))endendlocal function getWikidataDescription(title, args, fallback)local wikidata_id = mw.wikibase.getEntityIdForTitle(title)if isEmpty(wikidata_id) thenreturn nilendlocal wikidata_description, wikidata_description_lang = mw.wikibase.getDescriptionWithLang(wikidata_id)if isEmpty(wikidata_description) thenreturn nilendlocal 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 = args.lang_italic,nocat = args.lang_nocat,size = args.lang_size,cat = args.lang_cat,rtl = args.lang_rtl}endresult.fellback = fallbackreturn resultendlocal function getShortDescriptionTemplates(title_table)local page_content = title_table:getContent()-- Assume no content means a nonexistent title because it's cheaper than testing if it exists.if isEmpty(page_content) thenreturn {redlink = true}endlocal 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{}}') dolocal 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_contentend-- 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.endreturn contents_of_all_short_description_templatesendlocal 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 thencontents_of_all_short_description_templates = getShortDescriptionTemplates(args_name_title_table)if contents_of_all_short_description_templates.redlink thenreturn contents_of_all_short_description_templatesendredirected = falseendif #contents_of_all_short_description_templates < 1 thencontents_of_all_short_description_templates = getShortDescriptionTemplates(title_table)if notEmpty(redirected) thenredirected = trueendendif contents_of_all_short_description_templates.redlink thenreturn contents_of_all_short_description_templatesendif #contents_of_all_short_description_templates < 1 thenreturn nilendlocal quantity_of_things = {templates = #contents_of_all_short_description_templates,descriptions = 0,params = 0}local possible_short_descriptions = {}-- 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 thenquantity_of_things.params = #short_description_template_paramsendpossible_short_descriptions[template_content_index] = {}-- Look through the params:for i, param in ipairs(short_description_template_params) doif 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 = trueelselocal has_equals = param:match('=')if not has_equals or param:match('^1') then-- Grab the short description.if has_equals thenparam = mw.ustring.gsub(param, '^1%s*=%s*', '')end-- If the template has both a numbered and an unnumbered short description;-- whichever comes last (ltr) will be used by that template, so overwriting works out great.possible_short_descriptions[template_content_index].description = param-- And we want to know the total quantity of descriptions being declared.quantity_of_things.descriptions = quantity_of_things.descriptions + 1endendendendlocal short_descriptions = {}-- 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) doif possible_short_description.description then-- If a description is 'noreplace'-ing or 'none'; demote it.if (possible_short_description.noreplace or isNone(possible_short_description.description)) and#possible_short_descriptions > 1 then-- But don't demote it if it's already at the bottom.if i > 1 thentable.insert(short_descriptions, #short_descriptions, possible_short_description)elseshort_descriptions[#short_descriptions+1] = possible_short_descriptionendelseshort_descriptions[#short_descriptions+1] = possible_short_descriptionendendend-- Let previewWarning() work out if these numbers are bad.previewWarning(args_name, quantity_of_things)if #short_descriptions >= 1 then-- Pop!local short_description = short_descriptions[#short_descriptions].descriptionif notEmpty(short_description) thenreturn {explicit = short_description, fellback = fallback, redirected = redirected}endendreturn nilendlocal function isSisterProjectLink(title)local sister_project_prefixes = {'wiktionary', 'wikt','wikinews', 'n','wikibooks', 'b','wikiquote', 'q','wikisource', 's','wikispecies', 'species','wikiversity', 'v','wikivoyage', 'voy','commons', 'c','wikidata', 'd','mediawikiwiki', 'mw','wikimedia', 'foundation', 'wmf','meta', 'm','incubator','phabricator', 'phab'}local pre_colon = title:match('^(%a+):')if pre_colon thenfor i, sister in ipairs(sister_project_prefixes) doif pre_colon == sister thenreturn trueendendendreturn falseend-- Literally testing if title_table.isRedirect can be expensive;-- processing this way resolves (multiple) redirects without the possibly expensive check.local function getTitleAndTable(orig_name)local title_table = mw.title.new(orig_name)title_table = title_table.redirectTarget or title_tablelocal title = title_table.prefixedTextif title == orig_name thenreturn title, title_tableendreturn getTitleAndTable(title)endlocal function getDescription(args)local args_name = args.nameif isEmpty(args_name) thenreturn {alarm = 'requires a page name (including namespace)'}end-- Keep the orginal name, cleaned up, and its title_table for later.local args_name_title_table = mw.title.new(args_name)args_name = args_name_title_table.prefixedTextif isSisterProjectLink(args_name) thenreturn nilendlocal title, title_table = getTitleAndTable(args_name)if title ~= args_name thenif isSisterProjectLink(title) thenreturn nilendendlocal only = args.onlylocal prefer = args.prefer or 'explicit'-- Pass args_name to getShortDescription() so previewWarning()s won't be confusing for redirects.if notEmpty(only) thenif only == 'explicit' thenreturn getShortDescription(args_name, args_name_title_table, title, title_table)endif only == 'wikidata' thenreturn getWikidataDescription(title, args)endreturn {alarm = 'accepts either "explicit" or "wikidata" as the value of |only='}endif notEmpty(prefer) thenif prefer == 'explicit' thenlocal 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) thenreturn short_descriptionendendreturn getWikidataDescription(title, args, true)endif prefer == 'wikidata' thenreturn getWikidataDescription(title, args) or getShortDescription(args_name, args_name_title_table, title, title_table, true)endreturn {alarm = 'accepts either "explicit" or "wikidata" as the value of |prefer='}endendlocal function main(args)local result = getDescription(args)if notEmpty(result) thenif result.alarm thenresult.alarm = alarmingMessage(result.alarm)endif args.stringify thenif result.alarm thenresult = result.alarmelseresult = result.explicit or result.wikidataif args.none_is_nil and isNone(result) thenresult = nilendendelseif not result.alarm and args.none_is_nil thenlocal description = result.explicit or result.wikidataif description and args.none_is_nil and isNone(description) thenresult = nilendendendreturn resultendlocal p = {}function p.main(frame)local args = require('Module:Arguments').getArgs(frame)if isEmpty(args) thenreturn alarmingMessage('could not getArgs') -- This really would be alarming.endreturn main(args)endreturn p