Toggle menu
15
236
70
27.5K
Kenshi Wiki
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.
Revision as of 01:35, 2 March 2025 by Prd (talk | contribs) (Created page with "require('strict'); --[[--------------------------< E X T R A C T _ F R O M _ T E M P L A T E >------------------------------------ no direct template access extracts short description text from a named template in the named article when that template is found in article wiki source requires three arguments: frame: frame object required to preprocess template_name article_title: the name of the article to inspect - correct spelling and captialization is required te...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)


Usage

{{#invoke:Extract short description|function_name}}

  • Appears to be an older, alternative means of accomplishing it. See the 2022 strict addition @ the page's history.



require('strict');

--[[--------------------------< E X T R A C T _ F R O M _ T E M P L A T E >------------------------------------

no direct template access

extracts short description text from a named template in the named article when that template is found in article
wiki source

requires three arguments:
	frame: frame object required to preprocess template_name
	article_title: the name of the article to inspect - correct spelling and captialization is required
	template_names_tbl: a single template name (a string) or a table of one or more template names all without
		namespace to be inspected - correct spelling and captialization is required

returns two values:
	on success, returns the short description text and true
	on failure, returns error message and nil

]]

local function extract_from_template (frame, article_title, template_names_tbl)
	local content = mw.title.new (article_title):getContent();					-- read the unparsed article source
	if not content then
		return '<span style="font-size:100%;" class="error">error: no article: ' .. article_title .. '</span>';
	end

	local template_name_pattern;
	local start;
	
	if 'string' == type (template_names_tbl) then								-- when single template name passed in as a string
		template_names_tbl = {template_names_tbl};								-- convert to a table
	end
	
	local templateName
	for _, template_name in ipairs (template_names_tbl) do						-- loop through the name in the table
		template_name_pattern = template_name:gsub ('^%a', string.lower):gsub ('^%a', '%[%1%1%]'):gsub ('%[%a', string.upper);	-- make lua pattern for initial letter upper or lower case: A -> [Aa]
		start = content:find ('{{%s*' .. template_name_pattern);				-- find the start of {{template name ...;
		if start then
			templateName = template_name
			break;																-- found a matching template
		end
	end

	if not start then															-- no templates found: return name of first template in template_names_tbl in error message
		return '<span style="font-size:100%;" class="error">error: no template: ' .. template_names_tbl[1] .. ' in: ' .. article_title .. '</span>';
	end

	local text = string.match (content, '%b{}', start);							-- start points to first { of the templateName
	if not text then
		return '<span style="font-size:100%;" class="error">error: failed to extract template: ' .. templateName .. '</span>';
	end

	text = text:gsub ('<ref[^>]->[^<]-</ref>', '');								-- delete references before preprocessing; they do not belong in shortdesc text
	text = text:gsub ('<ref[^>]-/ *>', '');										-- also delete self-closed named references
	text = text:gsub ('{{%s*sfn[^}]-}}', '');									-- delete sfn template which make references using {{#tag:}} parser functions
	text = text:gsub ('{{#tag:ref[^}]-}}', '');									-- and delete these too

	text = frame:preprocess (text):match ('<div[^>]-class="shortdescription.->(.-)</div>');		-- preprocess and extract shortdescription text
	if not text then
		return '<span style="font-size:100%;" class="error">error: no short description text in: ' .. templateName .. ' in '.. article_title .. '</span>';
	end

	return mw.text.trim (text), true;											-- trim whitespace and done
																				-- preprocess the template then apply syntax highlighting
																				-- this will display the preprocessed template; not usable here
																				-- for much other than debugging because syntaxhighlight returns a stripmarker
--	return template_name .. frame:callParserFunction ('#tag:syntaxhighlight', frame:preprocess (text));
end


--[[--------------------------< E X T R A C T _ F R O M _ A R T I C L E >--------------------------------------

no direct template access

extracts short description text from {{short description}} template when that template is found in article wiki
source; searches for both the long name (short description) and the short-name redirect (SHD); if both are present
long name controls; if multiples of the same name are present, the first-found controls.

requires one argument: article_title is the name of the article to be inspected

on success, returns the short description text; error message else

]]

local function extract_from_article (article_title)
	local content = mw.title.new (article_title):getContent();					-- read the unparsed article source
	if not content then
		return '<span style="font-size:100%;" class="error">error: no article: ' .. article_title .. '</span>';
	end

	local text, start;
	
	start = string.find (content, '{{%s*[Ss]hort description') or				-- find the start of {{Short description}} template
		string.find (content, '{{%s*SHD');										-- not full name, try the {{SHD}} redirect

	if not start then
		return '<span style="font-size:100%;" class="error">error: no short description in: ' .. article_title .. '</span>';
	end

	text = content:match ('%b{}', start);										-- get the short description template; start points to first { of the template
	if not text then
		return '<span style="font-size:100%;" class="error">error: failed to extract short description template from ' .. article_title .. '</span>';
	end

	text = text:match ('^[^|}]+|%s*(.+)%s*}}$');								-- strip '{{template name|' and '}}'; trim leading and trailing whitespace
	
	return text and text or '<span style="font-size:100%;" class="error">error: no short description text in: ' .. article_title .. '</span>';
end


--[[--------------------------< E X T R A C T _ S H O R T _ D E S C R I P T I O N >----------------------------

template entry point:
	{{#invoke:extract short description|extract_short_description}}

search for and return text that is used by the {{short description}} template.  {{Short description}}, also {{SHD}}
may be located in article wikisource or embedded in a template (commonly an infobox template).  When neither of
|template= and {{{2|}}} are set, this code will look in the article wiki source; when set, this code look inside the
named template.

This template entry takes two parameters:
	{{{1}}} or |article=: required; name of wiki article from which to extract the short description
	{{{2}}} or |template=; optional; name of template that holds the {{short description}} template

on success, returns the short description text; error message else

]]

local function extract_short_description (frame)
	local getArgs = require('Module:Arguments').getArgs;
	local args = getArgs(frame);
	
	if args[1] and args.article then											-- both assigned, fail with an error message
		return '<span style="font-size:100%;" class="error">error: conflicting |{{{1}}} and |article= parameters</span>';
	end
	
	local article_title = args[1] or args.article;								-- the required parameter
	
	if not article_title then													-- not supplied, fail with an error message
		return '<span style="font-size:100%;" class="error">error: article title required</span>';
	end
	
	local template_name = args[2] or args.template;								-- optional
	
	if template_name then
		local text, _ = extract_from_template (frame, article_title, template_name);	-- ignore second return value
		return text;
	else
		return extract_from_article (article_title);
	end
end


--[[--------------------------< E X P O R T E D   F U N C T I O N S >------------------------------------------
]]

return {
	extract_short_description = extract_short_description,
	extract_from_template = extract_from_template,
	extract_from_article = extract_from_article,
	}
Contents